将子字符串从文本框添加到列表框

时间:2016-07-26 05:13:48

标签: c#

我有一个文本框,用户在其中输入一些字符串。现在,我从主字符串中提取子字符串并将其显示在列表框中。

例如:  如果用户输入: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();
        }

    }

2 个答案:

答案 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();
               }
            }
  }

您也可以使用按钮点击执行此操作。同样的逻辑也适用于那里