C# 从组合框中检索数据源的内容

C# 从组合框中检索数据源的内容,c#,asp.net,C#,Asp.net,我有一个组合框,可以绑定到具有三个属性的对象列表:inta、intb和string x。绑定时,我将DataTextField设置为x,将DataValueField设置为a。我要做的是在集合绑定到列表后,在代码隐藏中获取b的值。我不想使用ViewState。我可以使用反射吗?像这样的 var dataSource = ddlTest.GetDataSource(); var newDataSource = dataSource.GetType().GetProperty("_dataSourc

我有一个组合框,可以绑定到具有三个属性的对象列表:
inta
intb
string x
。绑定时,我将
DataTextField
设置为
x
,将
DataValueField
设置为
a
。我要做的是在集合绑定到列表后,在代码隐藏中获取
b
的值。我不想使用ViewState。我可以使用反射吗?像这样的

var dataSource = ddlTest.GetDataSource();
var newDataSource = dataSource.GetType().GetProperty("_dataSource", 
    BindingFlags.NonPublic | BindingFlags.Instance);

我认为这种方法应该奏效。但是,要通过反射获得属性值,必须执行以下操作:

var dataSource = ddlTest.DataSource;
PropertyInfo property = dataSource.GetType().GetProperty("b", BindingFlags.NonPublic | BindingFlags.Instance);
var bValue = property.GetValue(dataSource, null);
编辑 我认为问题在于我们没有考虑数据源是数组/列表这一事实。我的工作原理如下:

var data = (IEnumerable<object>)ddlTest.DataSource;        
Type t = typeof(MyClass);
var item = data.ToArray()[0];
System.Reflection.PropertyInfo pi = t.GetProperty("b");
int val = (int)pi.GetValue(item, null);
var data=(IEnumerable)ddlTest.DataSource;
类型t=类型(MyClass);
var item=data.ToArray()[0];
System.Reflection.PropertyInfo pi=t.GetProperty(“b”);
int val=(int)pi.GetValue(项,null);
这是在我在页面_Init中这样设置数据源之后:

var data = new List<MyClass> { new MyClass() { a = 1, b = 2, x = "testing" } };
ddl.DataSource = data;
ddl.DataBind();
var data=newlist{new MyClass(){a=1,b=2,x=“testing”};
ddl.DataSource=数据;
ddl.DataBind();

对此我不确定,但您可以将
b
作为自定义属性添加到
列表项中。尝试类似的方法,看看是否有效:

var table = new DataTable("TableName"); 

//bind the dropdown to the result set
dropDownList.DataSource = table;
dropDownList.DataBind();

//iterate through the datasource and add custom attributes for each item in the list
table.AsEnumerable().ToList().ForEach(r => 
    dropDownList.Items.FindByValue(r.Field<int>("a").ToString()).Attributes["data-field"] = r.Field<int>("b").ToString());    
var table=新数据表(“TableName”);
//将下拉列表绑定到结果集
dropDownList.DataSource=表;
dropDownList.DataBind();
//遍历数据源并为列表中的每个项添加自定义属性
table.AsEnumerable().ToList().ForEach(r=>
dropDownList.Items.FindByValue(r.Field(“a”).ToString()).Attributes[“data Field”]=r.Field(“b”).ToString());
如果您希望使用常规foreach循环:

foreach (DataRow row in table.Rows)
{
    var item = dropDownList.FindByValue(row.Field<int>("a").ToString());
    if (item != null)
    {
        item.Attributes["data-value"] = row.Field<int>("b").ToString();
    }
}
foreach(table.Rows中的数据行)
{
var item=dropDownList.FindByValue(row.Field(“a”).ToString());
如果(项!=null)
{
item.Attributes[“数据值”]=行.Field(“b”).ToString();
}
}

如果添加自定义属性不起作用,并且不想使用ViewState,则可能必须在值字段中存储
a
b
,并用delimeter分隔。这可能是一件痛苦的事情,因为您必须解析项以获取值,但是如果自定义属性不起作用,那么根据您的需求,这可能是最好的选择

您想只获取单行的值还是所有行的值?请显示更多代码,例如数据源的类。您希望何时检索数据源的内容?回发后,不再有
b
。我想获取所有行。我正在对此控件创建一个自定义属性,该属性将集合中B的值设置为另一个属性。因此,我需要在重写DataBind()时访问它。这只是一个常规的ASP.NET
DropDownList
?添加属性听起来是唯一可行的方法,因为您需要一个未绑定到控件的值(键/值),并且不想使用ViewState存储数据源。如果您不喜欢这样,可以在绑定之前合并a&B,然后在后面解析代码,或者如果您的键/值是唯一值,则在服务器上重新查询DS。这就是我所想的,但当我这样做时,“属性”返回为null。有什么想法吗?@JonathanO查看我上面的编辑。我认为这应该行得通。