计算元音的事件

时间:2009-07-28 12:04:22

标签: c# counter

我想知道在文本框中输入句子时,在计算元音时会使用哪些事件/事件。

我不太确定它是否与“KeyPress”或“KeyUp”有关。

感谢您的帮助。

=====

这就是我被困的地方:

  private void btnCount_Click(object sender, EventArgs e)
    {
        string yourSentence;
        yourSentence = textBox1.Text.ToLower().Trim();

        char ch1 = 'a';
        char ch2 = 'e';
        char ch3 = 'i';
        char ch4 = 'o';
        char ch5 = 'u';

        int counta = 0;
        int counte = 0;
        int counti = 0;
        int counto = 0;
        int countu = 0;

        int j = counta + counte + counti + counto + countu;



    foreach (char v in yourSentence)
    {
        if (v == ch1) { counta++; j++; }

        else if (v == ch2) { counte++; j++; }

        else if (v == ch3) { counti++; j++; }

        else if (v == ch4) { counto++; j++; }

        else if (v == ch5) { countu++; j++; }
    }



      listBox1.Items.Add("There are " + counta.ToString().Trim() + " a's in the sentence");
        listBox1.Items.Add("There are " + counte.ToString().Trim() + " e's in the sentence");
        listBox1.Items.Add("There are " + counti.ToString().Trim() + " i's in the sentence");
        listBox1.Items.Add("There are " + counto.ToString().Trim() + " o's in the sentence");
        listBox1.Items.Add("There are " + countu.ToString().Trim() + " u's in the sentence");
        listBox1.Items.Add("All in all there are " + j.ToString().Trim() + " vowels in the sentence");


  private void textBox1_KeyDown(object sender, EventArgs e)
     {
          string yourSentence;
          yourSentence = textBox1.Text.ToLower().Trim();

         //I think I have to add the codings here. But what will happened to the 
         //btnCount_Click?

     }

4 个答案:

答案 0 :(得分:4)

在TextBox中有一个TextChanged事件,只要输入或删除字符就会触发该事件。这可以用来实时计算元音。

修改

我将来自textBox1_keyDown和btnCount_Click的代码组合在一起并将其放入TextChanged事件中,它几乎完美地运行。我只需要添加一行:

listBox1.Items.Clear();

...将项目添加到列表框之前。这样,在添加计数之前清空列表框。

结果如下:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string yourSentence;
        yourSentence = textBox1.Text.ToLower().Trim();

        char ch1 = 'a';
        char ch2 = 'e';
        char ch3 = 'i';
        char ch4 = 'o';
        char ch5 = 'u';

        int counta = 0;
        int counte = 0;
        int counti = 0;
        int counto = 0;
        int countu = 0;

        int j = counta + counte + counti + counto + countu;



        foreach (char v in yourSentence)
        {
            if (v == ch1) { counta++; j++; }

            else if (v == ch2) { counte++; j++; }

            else if (v == ch3) { counti++; j++; }

            else if (v == ch4) { counto++; j++; }

            else if (v == ch5) { countu++; j++; }
        }


        listBox1.Items.Clear();
        listBox1.Items.Add("There are " + counta.ToString().Trim() + " a's in the sentence");
        listBox1.Items.Add("There are " + counte.ToString().Trim() + " e's in the sentence");
        listBox1.Items.Add("There are " + counti.ToString().Trim() + " i's in the sentence");
        listBox1.Items.Add("There are " + counto.ToString().Trim() + " o's in the sentence");
        listBox1.Items.Add("There are " + countu.ToString().Trim() + " u's in the sentence");
        listBox1.Items.Add("All in all there are " + j.ToString().Trim() + " vowels in the sentence");

    }

我不需要任何其他代码来完成这项工作。

答案 1 :(得分:2)

我构建了一个类似于AJAX文本框的搜索框 - 它根据文本框中“已到目前为止”键入的内容进行搜索。无需键入文本,然后单击关联按钮。它会在您键入时进行搜索。我不知道是否有这个UI模式的名称,那就是。

动态搜索被挂钩到TextChanged事件。但关键是,我不想在文本被主动更改时搜索,因为用户正在键入。我希望在更改完成时,在键入停止时进行搜索。

这对你也很有意思。

我使用的hueristic:如果在最后一次textchange事件之后经过了600ms,那么键入已经停止,而那是,应该运行搜索。但是如何让代码在TextChange事件后运行600ms。事件处理程序中的Thread.Sleep是不可能的。这只会导致UI延迟。

我想出的解决方案是:在TextChange事件中使用Threadpool.QueueUserWorkItem来排队一个名为 MaybeDoSearch 的工作方法。在该工作者中,对延迟间隔(600ms)执行Thread.Sleep。睡眠完成后,检查自上一次TextChanged事件以来经过的时间。如果该时间超过600毫秒,则实际进行搜索。

看起来像这样

    System.DateTime _lastChangeInSearchText;
    private const int DELAY_IN_MILLISECONDS = 600;

    private void tbSearch_TextChanged(object sender, EventArgs e)
    {
        _lastChangeInSearchText = System.DateTime.Now;
        string textToFind = tbSearch.Text;
        if ((textToFind != null) && (textToFind != ""))
            System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(MaybeDoSearch), textToFind);
        else 
        {
            // clear the ListView that contains the search results 
            this.ListView2.Items.Clear();
        }
    }

    private void MaybeDoSearch(object o)
    {
        System.Threading.Thread.Sleep(DELAY_IN_MILLISECONDS);
        System.DateTime now = System.DateTime.Now;
        var _delta = now - _lastChangeInSearchText;
        if (_delta >= new System.TimeSpan(0,0,0,0,DELAY_IN_MILLISECONDS))
        {
            // actually do the search
            ShowSearchResults();
        }
    }

我是一个WinForms应用程序。因为MaybeDoSearch()在工作线程而不是UI线程上运行,所以在ShowSearchResults()中,必须使用InvokeRequired保护UI更新。

  

在正常打字期间,一个人将在600毫秒内输入2或3个字符。结果是,在键入正在发生的任何给定时刻,在单独的线程池线程上有2或3个工作项排队并运行(主要是休眠)。

之前有人建议您必须在每次更改时重新扫描元音的所有文本。这是运行时的冗余工作,为了提高效率,通常需要避免。但是代码就这么简单了。我有同样的问题,并决定不试图找出如何文本随当前TextChange事件而改变。它改变了,所以代码进行了全新的搜索。搜索比延迟间隔(600ms)更快完成。在你的情况下,计算元音,它会更快。

答案 2 :(得分:1)

我们来看看。这可以在所有这些中完成,但有些事件更有可能发生。

KeyDown:在KeyDown中,键仍然通常表示为整数。你必须自己映射元音。重复值仅触发一次。所以你可能会松开一些元音。

KeyPressed:在这里你得到了正确表示的关键。如果按下元音,请添加一个。但如果按 del 退格,我是否必须减去一个?您不知道哪个密钥已被删除。

KeyUp:同样,表示是一个整数。重复的值只会触发它们。

TextChanged:只要文本发生变化,就会触发此操作。在这里你根本不知道最后按下的键是什么(它可能在文本中的位置),所以你必须从头开始重新计算元音的数量。

我会这样做:

private void textBox1_TextChanged(object sender, EventArgs e)
 {
      btnCount_Click(sender, e);
 }

这样,每次文本更改时都会进行计算,此外也可以按下按钮。如果您不想直接调用事件函数,请创建一个从两个地方调用的函数。

也许你想在TextChanged中不时地(见其他答案)这样做。

答案 3 :(得分:0)

按下琴键时会发射键盘。 (不确定) 当键上升(释放)(从键盘上移开手指)时,键UP将被触发