【问题标题】:Searching ListBox control and programmatically selecting closest match搜索 ListBox 控件并以编程方式选择最接近的匹配项
【发布时间】:2012-03-14 19:58:19
【问题描述】:

我有一个 ListBox 控件,其中填充了大型零售连锁店的分支机构。使用系统的员工必须登录到相关分行,我希望他们能够搜索列表框找到他们的分行。

我已经为搜索框中的文本更改创建了一个事件处理程序,并且已经尝试在 StackOverflow 上使用代码声音:

private int lastMatch = 0;

private void txtSearch_TextChanged(object sender, EventArgs e)
    {
        int x = 0;
        string match = txtSearch.Text;

        if (txtSearch.Text.Length != 0)
        {
            bool found = true;
            while (found)
            {
                if (lbBranches.Items.Count == x)
                {
                    lbBranches.SetSelected(lastMatch, true);
                    found = false;
                }
                else
                {
                    lbBranches.SetSelected(x, true);
                    match = lbBranches.SelectedValue.ToString();
                    if (match.Contains(txtSearch.Text))
                    {
                        lastMatch = x;
                        found = false;
                    }
                    x++;
                }
            }
        }
    }

当我编译并开始在搜索框中输入时,我收到此错误:

Object reference not set to an instance of an object.

有问题的行是:

match = lbBranches.SelectedValue.ToString();

我不知道那里可能出了什么问题,有人知道吗?

谢谢!

【问题讨论】:

  • 通常,该错误意味着您正在尝试引用空对象的属性。在给定的行中,lbBranches 或其SelectedValue 属性似乎为空。从给出的代码中很难判断为什么会这样。

标签: c# search listbox


【解决方案1】:

只有在您指定了列表框的 ValueMember 属性以指示您希望从中读取所选项目值的属性时,列表框的 SelectedValue 才会返回一个值。在这种情况下您要使用的属性是 SelectedItem:

match = lbBranches.SelectedItem.ToString();

【讨论】:

  • 干杯,成功了。现在我只需要弄清楚为什么它没有选择正确的项目:p
  • 根据我在您的代码中看到的内容,它将匹配找到的第一个满足包含条件的字符并退出循环,因此如果您在文本框中只有一个简短的字符列表,它可能似乎与不正确的匹配。我同意 Hardyv 的观点,您应该考虑使用允许提前输入的下拉菜单。
【解决方案2】:

当用户输入文本时,可能没有选择任何值(因此出现错误)- 请记住,用户输入的内容与控件列表框子元素中的选择没有强制性或直接关联

使用完整的组合框控件,您正在做的事情可能更容易实现,我认为 MSDN 上的一些示例对您也很有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2019-10-06
    • 1970-01-01
    • 2014-03-24
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多