2012-04-11 16 views
3

私はコンボボックスを持っています。コンボボックスは、int aint b、およびstring xの3つのプロパティを持つオブジェクトのリストにバインドしています。拘束されたとき、私はDataTextFieldxDataValueFieldからaに設定しました。私がしたいのは、コレクションがリストにバインドされた後にコード体系でbの値を取得することです。私はViewStateを使いたくありません。おそらく反射を使用することはできますか?このようなもの?コンボボックスからDataSourceの内容を取得します

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

単一の行の値またはすべての行の値だけを取得したいですか? – sarwar026

+0

データソースのクラスなど、コードの詳細を表示してください。いつあなたはDataSourceの内容を取得したいですか?ポストバックの後にはもう "b"はありません。 –

+0

すべての行を取得したい。私は、このコントロール上のBの値を別のプロパティに設定するカスタムコントロールを作成しています。だから、私はそれがDataBind()をオーバーライドするときにアクセスする必要があります – joncodo

答えて

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

0

私はアプローチがうまくいかなければならないと思います。しかし、あなたがこれをしなければならない反射してプロパティ値を取得するには:

var dataSource = ddlTest.DataSource; 
PropertyInfo property = dataSource.GetType().GetProperty("b", BindingFlags.NonPublic | BindingFlags.Instance); 
var bValue = property.GetValue(dataSource, null); 

EDIT 私はこの問題は、我々はデータソースが配列/リストであるという事実を考慮していなかったということだと思います。次のように私はこれが動作するようになった:

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

それは私が考えていたものですが、私がそうすると、 "プロパティ"がnullに戻ります。何か案は? – joncodo

+0

@JonathanOは私の上記の編集をチェックアウトします。私はこれがうまくいくと思います。 – McGarnagle

関連する問題