TextBox.TextChange 用 C# 更新屏幕上的列表框
TextBox.TextChange to update an onscreen ListBox in C#
现在这听起来可能并不神秘,但我对处理 on-screen 元素和 Form
s 等 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);
}
查看该代码,有一个元素需要解释,lb
。 lb
在这种情况下是 public
ListBox
,其中包含一定数量的 string
元素。它被定义为任何方法之外的ListBox
。
现在,在定义 searchBox
的方法中,我按如下方式填充了 lb
:
foreach (string value in list)
{
lb.Items.Add(value.title);
}
(如果重要的话,我还应该提到 lb
添加 string
发生在稍后插入 fSelect
Form
之前。)
现在,对于那些还没有猜出我的问题的人;我希望向用户展示一个 Form
,上面有一个 ListBox
。此 ListBox
中的元素将是包含用户键入 searchBox
的 string
的任何元素,因为用户键入它。
问题是,搜索只执行一次,唯一搜索的是用户在 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”,但您仍然尝试使用旧列表中的项目。
希望对您有所帮助,
多米尼克
现在这听起来可能并不神秘,但我对处理 on-screen 元素和 Form
s 等 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);
}
查看该代码,有一个元素需要解释,lb
。 lb
在这种情况下是 public
ListBox
,其中包含一定数量的 string
元素。它被定义为任何方法之外的ListBox
。
现在,在定义 searchBox
的方法中,我按如下方式填充了 lb
:
foreach (string value in list)
{
lb.Items.Add(value.title);
}
(如果重要的话,我还应该提到 lb
添加 string
发生在稍后插入 fSelect
Form
之前。)
现在,对于那些还没有猜出我的问题的人;我希望向用户展示一个 Form
,上面有一个 ListBox
。此 ListBox
中的元素将是包含用户键入 searchBox
的 string
的任何元素,因为用户键入它。
问题是,搜索只执行一次,唯一搜索的是用户在 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”,但您仍然尝试使用旧列表中的项目。
希望对您有所帮助,
多米尼克