繁体   English   中英

TextBox.TextChange更新C#屏幕上的ListBox

[英]TextBox.TextChange to update an onscreen ListBox in C#

现在,这听起来可能并不十分神秘,但是我在C#处理屏幕元素和Form以及诸如此类还有些陌生,所以请在这里接受。 这也将很长,因为我觉得我应该提供尽可能多的信息。

我有一个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 在这种情况下, lb是一个public ListBox ,其中包含一定数量的string元素。 它定义为任何方法之外的ListBox

现在,在定义我的searchBox的方法中,我按照以下步骤填充了lb

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

(如果很重要,我还应该提到将string s添加到lb是在稍后将其插入fSelect Form 。)

现在,对于那些尚未猜出我的问题的人; 我希望为用户提供一个带有ListBoxForm ListBox的元素将是包含用户在searchBoxstring的任何元素, searchBox用户键入它即可。

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

我该如何获得一个Form ,该Form根据用户输入到searchBox内容显示一个包含元素的ListBox

问题是您正在遍历lb ,这是您在第一次触发text_Changed时删除的。 因此,您没有更多可循环浏览和过滤ListBox 最简单的解决方法是从ListBox本身获取循环的项目,而不是从用来提供ListBoxList<string>获取循环的项目。

编辑

这是我的处理方式:

在表单类中,添加List<string> ,此列表是ListBox的基础。

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

现在,您可以在构造函数中将此列表填充所需的项。 是一些方法。 在我的示例中,为简单起见,我将手动添加所有项目。

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 ,而不是循环遍历已过滤的ListBox的项,而是循环遍历保存在List<string>所有项。

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

我希望这有帮助,

多米尼克

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM