2012-04-11 50 views
3

我有一個組合框,它綁定到具有三個屬性的對象列表:int a,int bstring x。當綁定時,我將DataTextField設置爲xDataValueFielda。我想要做的是在集合綁定到列表後,在代碼隱藏中獲取b的值。我不想使用ViewState。我可以使用反射嗎?像這樣?從組合框中檢索數據源的內容

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

你想得到只有單行的值或所有行的值? – sarwar026 2012-04-11 11:46:13

+0

請顯示更多的代碼,例如您的DataSource的類。您何時想要檢索DataSource的內容?回傳後沒有'b'了。 – 2012-04-11 11:47:38

+0

我想獲取所有行。我在這個控件上創建一個自定義屬性,將集合中B的值設置爲另一個屬性。所以我需要它被訪問時,我重寫DataBind() – joncodo 2012-04-11 12:02:47

回答

1

我不知道這一點,但你威力能夠將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,並用分隔符分隔。這可能很痛苦,因爲您必須解析項目才能獲取值,但是如果自定義屬性不起作用,那麼給定您的需求可能是最佳選擇。

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

這就是我的想法,但當我這樣做「財產」回來爲空。有任何想法嗎? – joncodo 2012-04-11 12:00:25

+0

@JonathanO查看我上面的編輯。我認爲這應該工作。 – McGarnagle 2012-04-12 02:50:13