我正在创建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。 我怎样才能做到这一点?感谢
答案 0 :(得分:0)
(确保使用Forms.Timer是否希望在UI线程上调用Tick处理程序)
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
}
}
答案 1 :(得分:0)
以下是我的问题的答案,以防有人为我的问题寻找答案。
我将计时器间隔设置为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;
}
答案 2 :(得分:0)
如果您能够使用反应式框架(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 */
});
}
代码自动处理富文本框文本更改事件,等待3秒,除非发生另一个文本更改,如果它再次开始等待,然后最终在UI线程上运行验证代码。
这是处理您需要的事件和时间的简短而简洁的方法。您可以通过安装“Rx-Main”&amp;和NuGet来添加Rx库。 “Rx-WinForms”软件包。