Получение элементов ComboBox с заполненным источником данных - PullRequest
3 голосов
/ 15 мая 2009

Учтите, что есть ComboBox, который заполняется через его свойство DataSource. Каждый элемент в ComboBox представляет собой пользовательский объект, и ComboBox имеет значения DisplayMember и ValueMember.

.
IList<CustomItem> aItems = new List<CustomItem>();
//CustomItem has Id and Value and is filled through its constructor
aItems.Add(1, "foo"); 
aItems.Add(2, "bar");

myComboBox.DataSource = aItems;

Теперь проблема в том, что я хочу читать элементы в виде строки, которая будет отображаться в пользовательском интерфейсе. Учтите, что я не знаю тип каждого элемента в ComboBox (CustomItem мне неизвестен)

Возможно ли это?

Ответы [ 4 ]

3 голосов
/ 15 мая 2009

Переплет:

ComboBox1.DataSource = aItems;
ComboBox1.DisplayMember = "Value";

Получение предмета:

CustomItem ci = ComboBox1.SelectedValue as CustomItem;

edit: Если все, что вы хотите получить, это список всех отображаемых значений комбинированного списка

List<String> displayedValues = new List<String>();
foreach (CustomItem ci in comboBox1.Items)
    displayedValues.Add(ci.Value);
2 голосов
/ 03 ноября 2009

Хотя немного дороже в вычислительном отношении, Reflection может делать то, что вы хотите:

using System.Reflection;    
private string GetPropertyFromObject(string propertyName, object obj)
    {
        PropertyInfo pi = obj.GetType().GetProperty(propertyName);
        if(pi != null)
        {
            object value = pi.GetValue(obj, null);
            if(value != null)
            {
                return value.ToString();
            }
        }
        //return empty string, null, or throw error
        return string.Empty;
    }
2 голосов
/ 15 мая 2009

Вы должны быть в состоянии получить в ValueMember и DisplayMember через отражение. Но опрос комбообокса может быть немного проще. Следующее будет работать, но, возможно, вы захотите окружить его SuspendUpdate или чем-то еще.

string s = string.Empty;
int n = comboBox1.Items.Count;

for (int i = 0; i < n; i++)
{
    comboBox1.SelectedIndex = i;
    s = s + ';' + comboBox1.Text; // not SelectedText;
}
2 голосов
/ 15 мая 2009

Создайте интерфейс, скажем ICustomFormatter, и пусть эти пользовательские объекты реализуют его.

interface ICustomFormatter
{
   public string ToString();
}

Затем вызовите метод ToString().

РЕДАКТИРОВАТЬ: ссылка на Декоратор шаблон.

...