在Windows窗体中插入计时器

时间:2012-07-31 07:45:35

标签: .net text timer

我正在创建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。 我怎样才能做到这一点?感谢

3 个答案:

答案 0 :(得分:0)

使用System.Windows.Forms.Timer

(确保使用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”软件包。