C # цикл через выпадающий список, где источник данных представляет собой данные с текстом - PullRequest
6 голосов
/ 09 ноября 2010

Можно ли пройти через каждый элемент в выпадающем списке, используя цикл foreach? Как бы я это сделал?

Дело в том, что у меня есть System.Data.DataRowView, потому что поле со списком прикреплено к DataTable. Как мне конвертировать из этого в string?

Ответы [ 8 ]

16 голосов
/ 09 ноября 2010

Как правило, это выглядит так:

foreach(object item in myComboBox.Items)
{
   DataRowView row = item as DataRowView;

   if(row != null)
   {
        string displayValue = row["myColumnName"].ToString();

        // do something
   }
   else
       // error: item was not of type DataRowView
}

см. Также http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.items.aspx

3 голосов
/ 09 ноября 2010
foreach (var item in combobox1.Items)
{
     //do stuff
}

Если вы знаете, что содержимое является строкой, вы можете сделать

foreach (object item in combobox1.Items)
{
     string text = (item as string);
     //do stuff with the text
}

Если вы используете .net 3.5 или более позднюю версию, вы можете немного ее сократить, используя Cast<T>() метод расширения IEnumerable<T> (который реализуется ObjectCollection, тип ComboBox.Items):

foreach (string text in combobox1.Items.Cast<string>())
{
     //do stuff with the text
}
2 голосов
/ 09 ноября 2010

Исходя из вашего предыдущего вопроса , звучит так, как будто вы хотите пройтись по пунктам, чтобы найти соответствующее текстовое значение.Вместо этого вы можете использовать метод ComboBox.FindStringExact , чтобы выполнить поиск без учета регистра, который будет возвращать индекс первого найденного совпадения, или -1, если он не находит нужный текст:

comboBox1.SelectedIndex = comboBox1.FindStringExact("4");
1 голос
/ 09 ноября 2010

Да, это просто стандартная коллекция.Например:

foreach(object item in myComboBox.Items)

"объект" - это, вероятно (но не обязательно) строка.Если вы знаете, что это всегда строка, вы можете изменить ее на:

foreach(string item in myComboBox.Items)
0 голосов
/ 26 февраля 2013

Я боролся с этой проблемой целую вечность, поскольку я часто использую элементы управления ComboBox, связанные с List <> различных классов.

Я действительно не хотел жестко кодировать имена полей в моей функции или иметь отдельную функцию SelectItemByValue для каждого типа класса List <>, который я бы использовал.

В конце концов я нашел следующее многоразовое решение.

List<EmployeeRecord> m_listOfEmployees = GetListOfEmployees();
...
comboBoxEmployees.DataSource = m_listOfEmployees;
comboBoxEmployees.DisplayMember = "EmployeeName";
comboBoxEmployees.ValueMember = "EmployeeID";

Чтобы выбрать элемент ComboBox с определенным идентификатором сотрудника:

   int someEmployeeID = 4;
   ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);

А вот функция, которая делает работу.

Готовься, это не красиво.

public static void SetComboBoxSelectionByValue<T>(ComboBox ctrl, int? value)
{
    //  If the ComboBox has no items, disable it  (so the user can immediately see there's nothing selectable)
    ctrl.Enabled = (ctrl.Items.Count > 0);

    int inx = 0;
    foreach (T t in ctrl.Items)
    {
        foreach (PropertyInfo info in typeof(T).GetProperties())
        {
            if (info.Name == ctrl.ValueMember)
            {
                object val = info.GetValue(t, null);
                if (val.ToString() == value.Value.ToString())
                {
                    ctrl.SelectedIndex = inx;
                    return;
                }
            }
        }
        inx++;
    }

    if (ctrl.Items.Count > 0)
        ctrl.SelectedIndex = 0;
}

Обратите внимание, как нужно вызывать функцию, передавая ей тип объектов, которые хранятся в каждом ComboBoxItem ( EmployeeRecord , в этом примере) вместе с указателем на ваш ComboBox и значение элемента, который вы хотите установить в качестве SelectedItem.

ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);

Функция просматривает элементы в ComboBox, находит поле «ValueMember» в записи этого элемента (в данном примере EmployeeID) и сравнивает значение ValueMember с требуемым параметром value .

Я знаю, я знаю, это не красиво, но когда вы привязываете List к ComboBox, вы не можете использовать DataRowView:

DataRowView row = item as DataRowView;
string displayValue = row["someColumnName"].ToString();

И если вам нужна одна универсальная функция SetComboBoxSelectionByValue, которая будет работать со списками классов любого типа, то вам нужно начать входить в PropertyInfos, чтобы найти значение поля в вашем конкретном классе.

0 голосов
/ 09 ноября 2010
foreach( object item in ComboBoxName.Items )
{
    <dosomething>
}

Что еще я могу сказать? Это обращается к ним по порядку, но все они будут объектами. Это зависит от вас, чтобы определить тип предмета.

0 голосов
/ 09 ноября 2010
foreach(ListItem item in this.myCombobox.Items) 
{
    //...
}
0 голосов
/ 09 ноября 2010

да - итерация по коллекции элементов управления:

foreach(var item in this.myCombobox.Items) 
{
    //your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...