我有一个文本框,用户在其中输入一些字符串。现在,我从主字符串中提取子字符串并将其显示在列表框中。
例如: 如果用户输入:SELECT A1,A2,A3 FROM TABLE1 然后我需要A1,A2和A3作为我的列表框的单独项目。
我能够轻松地做到这一点,但是正在发生一个小问题。
一旦用户输入单词“FROM”,值就会被添加到列表框中,如果用户在“FROM”(甚至是空格)后键入任何内容,则会再次添加这些值。
我只需要一次值。我错过了什么?请帮忙
private void textBox1_TextChanged(object sender, EventArgs e)
{
string substr;
string str = textBox1.Text.ToString();
Match m = Regex.Match(str, @"(?<=.\s+).+?(?=\s+from)", RegexOptions.IgnoreCase);
try
{
if (m.Success)
{
substr = m.Value;
string[] sub = substr.Split(',');
foreach (string x in sub)
{
listBox1.Items.Add(x);
}
}
finally
{
listBox1.EndUpdate();
}
}
答案 0 :(得分:2)
textBox1_TextChanged
在用户输入时,会对TextBox
上写入或删除的每个字符进行触发。您可以在每次要执行此操作时清除ListBox
(上述方法的第一个操作):
listBox1.Items.Clear();
我真的建议你采用另一种方法,对像TextChanged
这样的频繁事件执行某种重要的逻辑并不是一个好主意。可能你需要一个List,每次你比较结果并只添加新的。或者您可以通过单击按钮执行此逻辑,也可以在文本框失去焦点时执行此逻辑。
无论如何,除非你遇到糟糕的表现,否则你可以继续做你现在正在做的事情。
答案 1 :(得分:0)
您可以在文本框中输入按下事件执行此操作,因此用户首先插入全文,然后如果他/她按下回车按钮,则操作将执行
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
string substr;
string str = textBox1.Text.ToString();
Match m = Regex.Match(str, @"(?<=.\s+).+?(?=\s+from)", RegexOptions.IgnoreCase);
try
{
if (m.Success)
{
substr = m.Value;
string[] sub = substr.Split(',');
foreach (string x in sub)
{
listBox1.Items.Add(x);
}
}
}
finally
{
listBox1.EndUpdate();
}
}
}
您也可以使用按钮点击执行此操作。同样的逻辑也适用于那里