我正在创建Windows窗体,它将验证richtextbox中的文本,并根据给定的要求得到错误。我现在唯一的问题是,每次richtextbox更改验证时,我指的是每次按键。如何设置计时器,使用户每次编辑richtextbox框中的文本时,都会等待几秒钟来验证文本,而不仅仅是每次按键。为了清楚起见,下面是我的代码:
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
listView1.Items.Clear();
//Requirement.cs is a class where all the functions for formatting is placed.
Requirement req_obj = new Requirement();
req_obj.check_casing(richTextBox1, listView1, errors);
req_obj.check_punctuation(richTextBox1, listView1, errors);
req_obj.check_spacing(richTextBox1, listView1, errors);
req_obj.check_abbreviation(richTextBox1, listView1, errors);
req_obj.check_others(richTextBox1, listView1, errors);
label2.Text = "Warning(s) found:" + req_obj.error_counter;发生的情况是,每次用户在r.textbox中更改某些内容时,它都会自动验证每一次按键。我想要的是设置计时器每次用户将编辑文本,之后用户编辑文本,计时器计数3之前,它执行特定的过程。我该怎么做呢?谢谢
发布于 2012-07-31 15:54:34
使用System.Windows.Forms.Timer
(确保您希望在UI线程上调用记号处理程序时使用Forms.Timer )
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 3000;
timer.Tick += ValidationTimer_Tick;
timer.Start();
// ...
}
private void ValidationTimer_Tick(object sender, EventArgs e)
{
System.Windows.Forms.Timer timer = sender as System.Windows.Forms.Timer;
if(timer != null)
{
timer.Stop();
timer.Dispose();
// do validation
}
}发布于 2012-08-01 11:09:01
这是我的问题的答案,以防有人要为我的问题寻找答案。
我将计时器间隔设置为3000,并执行了以下操作:
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
errors = new List<ListviewError>();
listView1.Items.Clear();
Requirement req_obj = new Requirement();
req_obj.check_casing(richTextBox1, listView1, errors);
req_obj.check_punctuation(richTextBox1, listView1, errors);
req_obj.check_spacing(richTextBox1, listView1, errors);
req_obj.check_abbreviation(richTextBox1, listView1, errors);
req_obj.check_others(richTextBox1, listView1, errors);
label2.Text = "Warning(s) found:" + req_obj.error_counter;
timer1.Enabled = false;
}发布于 2012-08-01 11:29:49
如果您能够使用reactive框架(Rx),那么您可以很容易地完成这种计时代码。
试试这个:
public Form1()
{
InitializeComponent();
Observable
.FromEventPattern(
h => richTextBox1.TextChanged += h,
h => richTextBox1.TextChanged -= h)
.Select(_ => Observable.Timer(TimeSpan.FromSeconds(3.0)))
.Switch()
.ObserveOn(this)
.Subscribe(_ =>
{
/* Your validation code goes here */
});
}代码自动处理富文本框文本changed事件,等待3秒,除非发生另一个文本更改,如果发生,它将再次开始等待,最后在UI-thread上运行验证代码。
这是一种简洁、简洁的方式来处理你需要的事件和时间。您可以通过安装" Rx -Main“和"Rx-WinForms”包通过NuGet添加Rx库。
https://stackoverflow.com/questions/11735437
复制相似问题