3

、、、およびの3つのプロパティを持つオブジェクトのリストにバインドするコンボボックスがありint aます。バインドすると、とに設定します。私がやりたいのは、コレクションがリストにバインドされた後、コードビハインドでの値を取得することです。ViewStateを使いたくありません。リフレクションを使用できますか?このようなもの?int bstring xDataTextFieldxDataValueFieldab

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

2 に答える 2

1

これについてはよくわかりませんが、カスタム属性としてに追加できる場合があります。このようなものを試して、それが機能するかどうかを確認してください。bListItem

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を使用したくない場合は、区切り文字で区切って値フィールドにaとの両方を格納する必要がある場合があります。b値を取得するにはアイテムを解析する必要があるため、これは面倒な場合がありますが、カスタム属性が機能しない場合は、要件を考慮すると最適なオプションになる可能性があります。

于 2012-04-11T14:32:46.567 に答える
0

私はそのアプローチがうまくいくはずだと思います。ただし、リフレクションを使用してプロパティ値を取得するには、次のようにする必要があります。

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();
于 2012-04-11T11:49:26.237 に答える