[英]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
。)
现在,对于那些尚未猜出我的问题的人; 我希望为用户提供一个带有ListBox
的Form
。 该ListBox
的元素将是包含用户在searchBox
的string
的任何元素, searchBox
用户键入它即可。
问题是,搜索仅执行一次,唯一要搜索的是用户在searchBox
中输入的第一个键。 IE:如果我是用户,并且我要搜索“ key”,并且第一个字母是“ k”,则列表将更新以显示标题中带有“ k”的任何内容。 但是,当我尝试键入“ e”时,它不会更新或更改。 如果用户删除了searchBox
中的部分文本,它也不会恢复为旧列表。
我该如何获得一个Form
,该Form
根据用户输入到searchBox
内容显示一个包含元素的ListBox
?
问题是您正在遍历lb
,这是您在第一次触发text_Changed
时删除的。 因此,您没有更多可循环浏览和过滤ListBox
。 最简单的解决方法是从ListBox
本身获取循环的项目,而不是从用来提供ListBox
的List<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.