【问题标题】:TextBox.TextChange to update an onscreen ListBox in C#TextBox.TextChange 在 C# 中更新屏幕上的 ListBox
【发布时间】:2015-07-09 21:22:12
【问题描述】:

现在这听起来可能不是很神秘,但我对处理屏幕元素和Forms 等C# 有点陌生,所以请耐心等待。它也会有点长,因为我觉得我应该提供尽可能多的信息。

我有一个TextBox 对象,它被添加到我的fSelect(在这种情况下是我的Form),它是这样完成的:

TextBox searchBox = new TextBox();
fSelect.Controls.Add(searchBox);
searchBox.Location = new Point(40, 255);
searchBox.Width = 520;
searchBox.TextChanged += new EventHandler(searchBox_TextChanged);

现在,正如您所看到的,每当TextBox 中的某些内容发生变化时,都会执行某个操作。该操作将是:

private void searchBox_TextChanged(object sender, EventArgs e)
{
    TextBox s = (TextBox)sender;
    bool b = false;
    List<string> f = new List<string>();

    ListBox updatedLb = new ListBox();
    updatedLb.Size = new System.Drawing.Size(568, 255);
    updatedLb.SelectionMode = SelectionMode.MultiSimple;

    foreach (string value in lb.Items)
    {
        if (value.IndexOf(s.Text, StringComparison.OrdinalIgnoreCase) >= 0)
        {
            f.Add(value);
            b = true;
        }
    }

    for (int i = 0; i < f.Count; i++)
    {
        updatedLb.Items.Add(f[i]);
     }

    s.FindForm().Controls.Remove(lb);

    s.FindForm().Controls.Add(updatedLb);

}

查看该代码,有一个元素需要解释,lb。在这种情况下,lbpublic ListBox,其中包含一定数量的 string 元素。它在任何方法之外定义为ListBox

现在,在定义我的searchBox 的方法中,我填写了我的lb,如下所示:

foreach (string value in list)
{
    lb.Items.Add(value.title);
}

(如果重要的话,我还应该提到 strings 到 lb 的添加发生在稍后插入 fSelect Form 之前。)

现在,对于那些还没有猜到我的问题的人;我希望向用户展示一个带有ListBoxForm。此ListBox 中的元素将是包含用户键入searchBoxstring 的任何元素,因为用户键入它。

问题是,搜索只执行一次,并且唯一搜索的是用户在searchBox 中输入的第一个键。 IE:如果我是用户并且我要搜索“key”,并且第一个字母是“k”,则列表将更新以显示标题中带有“k”的任何内容。但是当我尝试输入“e”时,它不会更新或更改。如果用户删除searchBox 中的部分文本,它也不会恢复到旧列表。

我如何获得一个Form,它会根据用户输入searchBox 的内容向我显示ListBox 的元素?

【问题讨论】:

  • 我好像中途停了一句话。脑残。现在清理了,对不起读者!

标签: c# forms search textbox listbox


【解决方案1】:

问题是您正在循环通过lb,在text_Changed-Event 第一次触发时将其删除。所以你没有更多的项目可以循环和过滤你的ListBox。解决此问题的最简单方法不是从 ListBox 本身获取循环的项目,而是从用于提供 ListBoxList&lt;string&gt; 获取。

编辑

这是我的做法:

在您的表单类中添加一个List&lt;string&gt;,此列表是您的 ListBox 的基础。

List<string> listBoxItems = new List<string>();

现在你可以在你的构造函数中用你想要的项目填充这个列表。 Here 有一些方法可以做到这一点。对于我的示例,为简单起见,我将手动添加所有项目。

listBoxItems.Add("Item1");
listBoxItems.Add("abc");
listBoxItems.Add("CDE");
listBoxItems.Add("Abra");

然后你想用你的List中的项目填充你的ListBox

foreach (var s in listBoxItems)
{
    listBox1.Items.Add(s);
}

现在您只需要处理Text_Changed-Event。无需每次都创建一个新的 ListBox,您只需编辑表单中已有的列表框,而不是循环遍历 ListBox 中已过滤的项目,而是遍历保存在 List&lt;string&gt; 中的所有项目.

private void textBox1_TextChanged(object sender, EventArgs e)
{
    TextBox s = (TextBox)sender;

    listBox1.Items.Clear();

    foreach (string value in listBoxItems)
    {
        if (value.IndexOf(s.Text, StringComparison.OrdinalIgnoreCase) >= 0)
        {
            listBox1.Items.Add(value);
        }
    }
}

在您的代码中,您每次进入循环时都会创建一个新的“ListBox”,但您仍然尝试使用旧代码中的项目。

希望对你有帮助,

多米尼克

【讨论】:

  • 我可能有点慢,但我不确定我是否理解。你能用代码告诉我吗?毫无疑问,+1!
  • 我稍后会添加更详细的答案。查看您在代码中添加的列表框。您删除 lb 并尝试再次循环遍历它。
  • 好的,谢谢。如果没有其他人给它戳,我会等待:)
  • 好吧,我用一些代码编辑了我的答案。仔细阅读并询问您是否有不明白的地方。
  • 啊,完美!谢谢朋友!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2022-01-25
  • 2023-03-27
  • 2020-12-30
  • 1970-01-01
相关资源
最近更新 更多