2012-04-11 5 views
3

У меня есть сводка, которую я связываю со списком объектов с тремя свойствами: int a, int b и string x. При привязке установите DataTextField на x и DataValueField на a. То, что я хочу сделать, это получить значение b в коде после того, как коллекция была привязана к списку. Я не хочу использовать ViewState. Могу ли я использовать отражение? Что-то вроде этого?Извлечь содержимое DataSource из ComboBox

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

Вы хотите получить только значение одной строки или значение всей строки? – sarwar026

+0

Пожалуйста, покажите больше своего кода, например класс вашего DataSource. Когда вы хотите получить содержимое DataSource? После обратной передачи больше нет 'b'. –

+0

Я хочу получить все строки. Я создаю пользовательское свойство этого элемента управления, которое установит значения B в коллекции другому свойству. Поэтому мне нужно, чтобы это было доступно, когда я переопределял DataBind() – joncodo

ответ

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 (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 в поле значений, разделенных метрикой. Это может быть боль, потому что вам придется анализировать элементы для получения значений, но с учетом ваших требований, которые могут быть лучшим вариантом, если пользовательские атрибуты не работают.

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

Смежные вопросы