2009-05-18 58 views
8

我有一个多选列表框,我绑定到一个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和值列表框的ValueMember。现在取决于通过什么值,我需要在列表框中设置选定的项目。

这里是我的代码:

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;选择错误的项目?

+0

您可以提供更多关于您需要做什么或更完整的代码示例的信息吗?对象是从数据库中读取一个字段,并将所选的索引/值设置为列表框中的匹配值? – ryanulit 2009-05-18 13:17:42

+0

该列表框正在填充DataTable,DataTable又会从数据库中检索数据。我担心如果我在填充列表时设置了ValueMember,为什么是 lb.SelectedValue = valuePassedByUser; 不工作? – 2009-06-03 03:30:54

回答

7

好的...这里有很难回答的问题,我昨天才知道。这是我的错误,虽然我没有提到我的问题中的一件重要事情,因为我觉得它与手头的问题无关:

数据表中的数据未排序。因此,我已将列表框的Sorted属性设置为true。后来我意识到,当列表框的或甚至组合框的排序属性设置为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 

现在,如果我想为选择设置香蕉,我运行语句:

lb.SelectedValue = "B";

但不是作为选择设置香蕉,因为选择它集橙。为什么?因为如果列表未被排序,Banana的索引将为4.因此,尽管在Banana的排序索引为2之后,它将索引4设置为选中,从而使得Orange选择而不是Banana。

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

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; 
     } 
    } 
} 
0

试试这个: -

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

我想你就可以选择多个项目的唯一方法是通过使用foreach循环。 SelectedValue属性似乎只返回1个项目。如果你想选择多于1个项目,你将不得不使用:

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

另外,FindStringExact不通过值字段只通过看显示的文本搜索。另外,为了减少代码,可能需要将一个新变量作为列表框来施放,这样就不会将C作为列表框。

0

您可以使用 “FindByValue” 是这样的:

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

下面是如何解决它使用winforms,DotNet 4.6

listBox1.SelectedIndex = listBox1.FindString(stringInList); 
0

如果您不想循环选定的项目,则从listBox_SelectedIndexChanged事件中检索列表框的选定值,并在全局数组中添加该值。然后通过访问这个数组,你会得到欲望选择的项目值itemlist没有任何循环。

相关问题