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

本文关键字:数据源 检索 组合 | 更新日期: 2023-09-27 18:30:39

我有一个组合框,我绑定到具有三个属性的对象列表:int aint bstring x 。绑定后,我将DataTextField设置为 xDataValueField设置为 a 。我想做的是在集合绑定到列表后在代码隐藏中获取 b 的值。我不想使用视图状态。我可以使用反射吗?像这样的东西?

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

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

我不确定这一点,但您可以将b作为自定义属性添加到ListItem。尝试这样的事情,看看它是否有效:

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());    

如果您希望使用常规的 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();
    }
}

如果添加自定义属性不起作用,并且您不想使用 ViewState,则可能必须在值字段中存储ab,并用分量表分隔。这可能会很痛苦,因为您必须解析项目才能获取值,但考虑到您的要求,如果自定义属性不起作用,这可能是最佳选择。

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

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);

这是我在Page_Init中这样设置数据源之后:

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