使用foreach
循环遍历combobox中的每个项目是否可行?我该如何实现?
问题在于,我有一个System.Data.DataRowView
,因为combobox附加到了一个DataTable
上。我该如何将其转换为string
?
通常情况下,它看起来像这样:
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
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
}
comboBox1.SelectedIndex = comboBox1.FindStringExact("4");
是的,它只是一个标准集合。例如:
foreach(object item in myComboBox.Items)
“object” 可能是一个字符串(但不一定)。如果您知道它总是一个字符串,您可以将其更改为:
"foreach(string item in myComboBox.Items)
是的 - 通过控件的项目集合进行迭代:
foreach(var item in this.myCombobox.Items)
{
//your code
}
foreach(ListItem item in this.myCombobox.Items)
{
//...
}
foreach( object item in ComboBoxName.Items )
{
<dosomething>
}
我还能说什么呢?这将按顺序访问它们,但所有的都将是对象。由您来确定项目的类型。
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;
}
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
该函数遍历ComboBox中的项目,查找该项目记录中的“ValueMember”字段(例如EmployeeID),并将ValueMember的值与所需的value参数进行比较。
我知道,我知道,这不太好看,但当您将列表绑定到ComboBox时,就无法使用DataRowView:
DataRowView row = item as DataRowView;
string displayValue = row["someColumnName"].ToString();
如果你想要一个通用的SetComboBoxSelectionByValue函数,它可以使用任何类型的类的列表工作,那么你就需要开始使用PropertyInfos,在你特定的类中找到字段的值。