c#循环组合框,其中datasource是带文本的数据表

时间:2010-11-08 22:46:22

标签: c# .net winforms

是否可以使用foreach循环遍历组合框中的每个项目?我该怎么做?

事情是我有一个System.Data.DataRowView,因为组合框附加到DataTable。如何将其转换为string

8 个答案:

答案 0 :(得分:16)

通常,它看起来像这样:

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

答案 1 :(得分:3)

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>的{​​{1}}扩展方法缩短它(由ObjectCollection实现,ComboBox.Items的类型{1}}):

foreach (string text in combobox1.Items.Cast<string>())
{
     //do stuff with the text
}

答案 2 :(得分:2)

根据您的previous question,您可能想要遍历各个项目以查找匹配的文本值。相反,您可以使用ComboBox.FindStringExact方法进行不区分大小写的搜索,该搜索将返回找到的第一个匹配项的索引,如果找不到相关文本,则返回-1:

comboBox1.SelectedIndex = comboBox1.FindStringExact("4");

答案 3 :(得分:1)

是的,它只是一个标准的集合。例如:

foreach(object item in myComboBox.Items)

“object”可能(但不一定)是一个字符串。如果您知道它总是一个字符串,您可以将其更改为:

foreach(string item in myComboBox.Items)

答案 4 :(得分:0)

是 - 遍历控件的项集合:

foreach(var item in this.myCombobox.Items) 
{
    //your code
}

答案 5 :(得分:0)

foreach(ListItem item in this.myCombobox.Items) 
{
    //...
}

答案 6 :(得分:0)

foreach( object item in ComboBoxName.Items )
{
    <dosomething>
}

我还能说什么?这将按顺序访问它们,但所有都将是对象。由您决定项目的类型。

答案 7 :(得分:0)

我在这个问题上苦苦挣扎多年,因为我经常使用ComboBox控件,绑定到各种不同类的List&lt;&gt;。

我真的不想在我的函数中硬编码字段名,或者对每种类型的List&lt;&gt;都有单独的SelectItemByValue函数。我正在使用的课程。

我最终想出了以下可重用的解决方案。

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

选择具有特定员工ID的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中的Items,在该项的记录中查找“ValueMember”字段(在此示例中为EmployeeID),并将ValueMember的值与所需的参数进行比较。

我知道,我知道,它并不漂亮,但是当你将List绑定到ComboBox时,你就无法使用DataRowView:

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

如果你想要一个通用的SetComboBoxSelectionByValue函数,它可以使用任何类型的列表,那么你需要开始进入PropertyInfos,找到特定类中字段的值。