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

时间:2009-05-18 12:37:49

标签: c# listbox asp.net-2.0

我有一个多选列表框,我绑定到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;选择不正确的项目?

7 个答案:

答案 0 :(得分:7)

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

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

lb.SelectedValue = valuePassedByUser;

它将一些其他项设置为选中而不是设置Value为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;
        }
    }
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

试试这个: -

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

答案 3 :(得分:0)

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

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue))

答案 4 :(得分:0)

this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true);

答案 5 :(得分:0)

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

listBox1.SelectedIndex = listBox1.FindString(stringInList);

答案 6 :(得分:0)

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