我想知道在文本框中输入句子时,在计算元音时会使用哪些事件/事件。
我不太确定它是否与“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?
}
答案 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将被触发