在ListBox中设置所选项而不循环

我有一个多选列表框,我绑定到DataTable。 DataTable包含2列描述和值。

这是填充代码的列表框:

DataTable copytable = null; copytable = GlobalTable.Copy(); // GlobalTable is a DataTable copytable.Rows[0][0] = "--ALL--"; copytable.Rows[0][1] = "--ALL--"; breakTypeList.DataSource = copytable; this.breakTypeList.DisplayMember = copytable.Columns[0].ColumnName; // description this.breakTypeList.ValueMember = copytable.Columns[1].ColumnName; // value this.breakTypeList.SelectedIndex = -1; 

我将描述设置为DisplayMember,将值设置为ListBox的ValueMember。 现在,根据传递的值,我需要在ListBox中设置所选项。

这是我的代码:

 ListBox lb = c as ListBox; lb.SelectedValue = valuePassedByUser; 

这是行不通的。 因此,我不得不求助于下面的代码(我循环遍历列表框中的所有项目)

 for (int i = 0; i < lb.Items.Count; i++) { DataRowView dr = lb.Items[i] as DataRowView; if (dr["value"].ToString() == valuePassedByUser) { lb.SelectedIndices.Add(i); break; } } 

我想知道我的代码中缺少/错误的内容。 为什么lb.SelectedValue = valuePassedByUser; 选择错误的项目?

好的……这是我昨天才意识到的难以理解的答案。 虽然我没有在我的问题中提到一件重要的事情,但这是我的错误,因为我觉得它与手头的问题无关:

数据表中的数据未排序。 因此我将列表框的Sorted属性设置为true 。 后来我意识到当列表框或甚至combobox的sorted属性设置为true时,值成员不能正确设置。 所以,如果我写:

 lb.SelectedValue = valuePassedByUser; 

它将一些其他项设置为选中而不是设置其值为valuePassedByUser的项。 简而言之,它与指数混淆。

例如,如果我的初始数据是:

 Index ValueMember DisplayMember 1 A Apple 2 M Mango 3 O Orange 4 B Banana 

我设置sorted = true。 然后列表框项目是:

 Index ValueMember DisplayMember 1 A Apple 2 B Banana 3 M Mango 4 O Orange 

现在如果我想将Banana设置为选中,我运行stmt:

 lb.SelectedValue = "B"; 

但是,不是将Banana设置为选中,而是将Orange设置为已选中。 为什么? 由于列表未被排序,香蕉的索引将为4.因此,即使香蕉的排序索引为2,它将索引4设置为选中,从而使橙色选择而不是香蕉。

因此,对于已排序的列表框,我使用以下代码来设置所选项:

 private void SetSelectedBreakType(ListBox lb, string value) { for (int i = 0; i < lb.Items.Count; i++) { DataRowView dr = lb.Items[i] as DataRowView; if (dr["value"].ToString() == value) { lb.SelectedIndices.Add(i); break; } } } 

我认为你能够选择多个项目的唯一方法是使用foreach循环。 SelectedValue属性似乎只返回1个项目。 如果您想要选择多于1个项目,则必须使用:

 var tempListBox = c As ListBox; if (tempListBox != null) (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]); 

FindStringExact也不搜索Value字段,它只查看显示的文本。 另外,为了减少代码,可能希望将新变量强制转换为列表框,这样就不会继续将C转换为列表框。

试试这个:-

  var listBox = c as ListBox; var item = listBox.Items.FindByValue(fieldValue); if (item != null) listBox.SelectedValue = fieldValue; 

您可以像这样使用“FindByValue”:

 ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue)) 
 this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true); 

以下是我使用winforms,DotNet 4.6解决它的方法

 listBox1.SelectedIndex = listBox1.FindString(stringInList); 

如果您不想为所选项循环,则从listBox_SelectedIndexChanged事件中检索列表框的选定值,并在全局数组中添加该值。 然后通过访问该数组,您将获得所需项目列表的值,没有任何循环。