0

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

我不太确定这是否与“ 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

4 回答 4

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");

    }

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

于 2009-07-28T12:09:15.560 回答
2

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

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

这对你来说可能也很有趣。

我使用的启发式方法:如果在最后一个 textchange 事件之后经过了 600 毫秒,那么输入已经停止,这就是应该运行搜索的时间。但是如何让代码在 TextChange 事件后运行 600 毫秒。不能在事件处理程序中执行Thread.Sleep 。这只会导致 UI 延迟。

我想出的解决方案是:在 TextChange 事件中使用Threadpool.QueueUserWorkItem来排队一个名为MaybeDoSearch的工作方法。在该工作人员中,为延迟间隔(600 毫秒)执行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() 中,UI 更新必须使用InvokeRequired进行保护。

在正常打字过程中,一个人会在 600 毫秒内输入 2 或 3 个字符。结果是有 2 或 3 个工作项在单独的线程池线程上排队并运行(主要是睡眠),在任何给定的时刻,当打字活跃时。

之前有人建议,每次更改都必须重新扫描所有文本以查找元音。这是运行时的冗余工作,出于效率目的,您通常希望避免这种工作。但是这样代码就简单多了。我有同样的问题,并决定不试图弄清楚文本是如何随着当前 TextChange 事件而改变的。它发生了变化,因此代码进行了全新的搜索。搜索完成的速度比延迟间隔 (600ms) 快。在你的情况下,计算元音,它会更快。

于 2009-07-28T13:34:17.557 回答
1

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

KeyDown:在KeyDown中,key通常还是用整数来表示的。您必须自己映射元音。重复值只触发一次。所以你可能会丢失一些元音。

KeyPressed:在这里您可以得到正确表示的密钥。如果按下元音,则添加一个。但是,如果按下del或,我必须减去一个吗?backspace您不知道删除了哪个键。

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

TextChanged:每当文本更改时触发。在这里你不知道最后按下的键是什么(它可能在文本中的某个地方),所以你必须从头开始重新计算元音的数量。

我会这样做:

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

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

也许您只想在 TextChanged 中不时执行此操作(请参阅其他答案)。

于 2009-07-28T12:22:35.103 回答
0

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

于 2009-07-28T12:11:03.777 回答