TextBox.TextChange 用 C# 更新屏幕上的列表框

TextBox.TextChange to update an onscreen ListBox in C#

现在这听起来可能并不神秘,但我对处理 on-screen 元素和 Forms 等 C# 有点陌生,所以请多多包涵。它也会有点长,因为我觉得我应该提供尽可能多的信息。

我有一个 TextBox object,它被添加到我的 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);

}

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

现在,在定义 searchBox 的方法中,我按如下方式填充了 lb

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

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

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

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

中的部分文本,它也不会恢复到旧列表

如何获得一个 Form 显示 ListBox 以及基于用户输入 searchBox 的元素的 ListBox

问题是您正在循环 lb,您在 text_Changed-Event 第一次触发时将其删除。因此,您没有任何可以循环遍历和过滤 ListBox 的项目。解决这个问题的最简单方法不是从 ListBox 本身获取你循环的项目,而是从你用来提供 ListBox.

List<string>

编辑

我会这样做:

在您的表单 class 中添加一个 List<string>,此列表是您的 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-事件。不必每次都创建一个新的列表框,您只需编辑表单中已有的列表框,而不是遍历 ListBox 中已经过滤的项目,而是遍历保存在 ListBox 中的所有项目=18=].

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”,但您仍然尝试使用旧列表中的项目。

希望对您有所帮助,

多米尼克