使用C#循环遍历包含文本的DataTable数据源的ComboBox

5

使用foreach循环遍历combobox中的每个项目是否可行?我该如何实现?

问题在于,我有一个System.Data.DataRowView,因为combobox附加到了一个DataTable上。我该如何将其转换为string


你是在ComboBox中寻找一个特定的值吗?这和你上一个问题有关吗? - Jeff Ogata
8个回答

15

item.ToString() 将会给你在下拉框中显示的特定项的值。 - Remus
@我是一个女孩,如果你正在寻找一个特定文本的项目,有一个方法可以实现。 - Jeff Ogata
@adrift 非常感谢,问题是因为组合框附加到数据表上,所以我有一个'System.Data.DataRowView',我该如何将其转换为字符串? - Alex Gordon
如果您的“item”是DataRowView类型,您可以进行类型转换:DataRowView row = item as DataRowView; 然后您可以像这样获取特定列的值:row["columnName"]。 - Remus
@remus,太好了,您能把这个放到您的回答中吗? - Alex Gordon

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 或更高版本,可以通过使用 IEnumerable<T>Cast<T>() 扩展方法(由 ObjectCollection 实现,是 ComboBox.Items 的类型)来缩短代码:

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

非常感谢,问题是我有一个'System.Data.DataRowView',因为组合框附加到数据表上,如何将其转换为字符串。 - Alex Gordon
你需要知道在组合框中显示的数据的具体索引,并调用item[index]。很抱歉,我无法提供更多帮助,因为我对WinForms中的数据绑定没有经验。 - Femaref

2
根据您的之前的问题,似乎您想循环遍历项目以查找匹配的文本值。相反,您可以使用ComboBox.FindStringExact方法进行不区分大小写的搜索,它将返回第一个找到的匹配项的索引,如果没有找到所需的文本,则返回-1:
comboBox1.SelectedIndex = comboBox1.FindStringExact("4");

1

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

foreach(object item in myComboBox.Items)

"

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

"
foreach(string item in myComboBox.Items)

1
第二段代码将无法正常工作,因为myCombobox.Items是一个对象集合。 - Femaref

0

是的 - 通过控件的项目集合进行迭代:

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

它本质上是item.ToString()的值。 - dexter
非常感谢,问题是因为组合框连接到数据表,所以我有一个'System.Data.DataRowView',我该如何将其转换为字符串? - Alex Gordon

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

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

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


0
我在处理这个问题上挣扎了很久,因为我经常使用绑定到各种不同类别的List<>的ComboBox控件。
我真的不想在我的函数中硬编码字段名称,也不想为每种类型的List<>类别都有一个单独的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中的项目,查找该项目记录中的“ValueMember”字段(例如EmployeeID),并将ValueMember的值与所需的value参数进行比较。

我知道,我知道,这不太好看,但当您将列表绑定到ComboBox时,就无法使用DataRowView:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接