首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Windows窗体中插入计时器

在Windows窗体中插入计时器
EN

Stack Overflow用户
提问于 2012-07-31 15:45:35
回答 3查看 124关注 0票数 0

我正在创建Windows窗体,它将验证richtextbox中的文本,并根据给定的要求得到错误。我现在唯一的问题是,每次richtextbox更改验证时,我指的是每次按键。如何设置计时器,使用户每次编辑richtextbox框中的文本时,都会等待几秒钟来验证文本,而不仅仅是每次按键。为了清楚起见,下面是我的代码:

代码语言:javascript
复制
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之前,它执行特定的过程。我该怎么做呢?谢谢

EN

回答 3

Stack Overflow用户

发布于 2012-07-31 15:54:34

使用System.Windows.Forms.Timer

(确保您希望在UI线程上调用记号处理程序时使用Forms.Timer )

代码语言:javascript
复制
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
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-08-01 11:09:01

这是我的问题的答案,以防有人要为我的问题寻找答案。

我将计时器间隔设置为3000,并执行了以下操作:

代码语言:javascript
复制
 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;
        }
票数 0
EN

Stack Overflow用户

发布于 2012-08-01 11:29:49

如果您能够使用reactive框架(Rx),那么您可以很容易地完成这种计时代码。

试试这个:

代码语言:javascript
复制
    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库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11735437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档