【问题标题】:Setting selected item in a ListBox without looping在列表框中设置所选项目而不循环
【发布时间】:2023-03-29 16:37:01
【问题描述】:

我有一个绑定到 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;

我将 description 设置为 DisplayMember,将 value 设置为 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;选择不正确的项目?

【问题讨论】:

  • 您能否提供更多关于您究竟需要做什么的信息或更完整的代码示例?该对象是否从数据库中读取字段并将所选索引/值设置为列表框中的匹配值?
  • 列表框正在填充一个 DataTable,该 DataTable 又从数据库中检索到数据。我担心的是如果我在填充列表时设置了 ValueMember,为什么是 lb.SelectedValue = valuePassedByUser;不工作?

标签: c# listbox asp.net-2.0


【解决方案1】:

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

数据表中的数据未排序。因此,我将列表框的 Sorted 属性设置为 true。后来我意识到当列表框甚至组合框的 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 设置为选中。为什么?因为如果列表没有被排序,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;
        }
    }
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      试试这个:-

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

      【讨论】:

      • Items 集合上没有 FindByValue。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:
        this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true);
        

        【讨论】:

          【解决方案6】:

          这是我使用 winforms、DotNet 4.6 解决的方法

          listBox1.SelectedIndex = listBox1.FindString(stringInList);
          

          【讨论】:

            【解决方案7】:

            如果您不想循环选择项目,则从listBox_SelectedIndexChanged 事件中检索列表框的选定值并将该值添加到全局数组中。然后通过访问该数组,您将获得 itemlist 的期望选定项值,而无需任何循环。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-07-25
              • 1970-01-01
              • 1970-01-01
              • 2012-09-30
              • 1970-01-01
              • 1970-01-01
              • 2013-11-16
              • 2021-06-24
              相关资源
              最近更新 更多