0

リッチテキストボックス内のテキストを検証し、指定された要件に応じてエラーを取得する Windows フォームを作成しています。私の唯一の問題は、リッチテキストボックスが変更されるたびに検証が処理されていることです。つまり、すべてのキーを押すことです。ユーザーがリッチテキストボックス内のテキストを編集するたびに、キーを押すたびにではなく、テキストを検証するために数秒間待機するようにタイマーを設定するにはどうすればよいですか。明確にするために、私のコードは次のとおりです。

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をカウントします。どうやってやるの?ありがとう

4

3 に答える 3

0

System.Windows.Forms.Timerを使用する

(Forms.Timer を使用していることを確認して、Tick ハンドラーを UI スレッドで呼び出す必要があります)

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-07-31T07:54:33.947 に答える
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;
        }
于 2012-08-01T03:09:00.780 に答える
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」および「Rx-WinForms」パッケージをインストールすることにより、NuGet を介して Rx ライブラリを追加できます。

于 2012-08-01T03:29:48.577 に答える