0

標準の CheckBox があり、CheckChanged イベントでデータベースを呼び出して、他の場所で結果セットを更新します。ただし、データベースの呼び出しには約 1 秒かかる場合があり、これによりチェックボックスに描かれた目盛りが遅延し、ユーザーが何度もクリックする可能性があります。ユーザーの気持ちがわかる!!

とにかく、データベース呼び出しが行われる前に目盛りを描くことができますか???

前もって感謝します。

4

3 に答える 3

0

まず、UI スレッドでデータベース呼び出しを行わないことをお勧めします。代わりに BackgroundWorkerを使用するか、別のスレッドをスピンアップしてください。

ただし、ユーザーがチェックボックスをもう一度クリックするのを制御したいだけの場合は、コントロールを無効に設定し、カーソルを介して待機するようにユーザーに指示します。

public void CheckBox_CheckChanged(object sender, EventArgs e){
   CheckBox.Enabled = false;
   Cursor = Cursors.Wait;
   //Long Running database operation
   Cursor = Cursor.Default;
   CheckBox.Enabled = true;
}
于 2012-08-03T10:56:50.273 に答える
0

UI スレッドで低速のデータベース呼び出しを実行しないでください。BackgroundWorkerを使用します。

于 2012-08-03T10:58:05.173 に答える
0

他の人が述べたように、 BackgroundWorker クラスを使用できます。もう 1 つのオプションは、 Task Parallel Libraryを利用することです。

private void CheckBox_CheckChanged(object sender, EventArgs e)
{
    Task.Factory.StartNew<MyResultData>(DoLongOperation)
                .ContinueWith(UpdateUI, TaskScheduler.FromCurrentSynchronizationContext());
}

private MyResultData DoLongOperation()
{
    // Long operation

    // Return result to be used to update the UI
    return new MyResultData();
}

private void UpdateUI(Task<MyResultData> task)
{
    // Get the result of the task
    MyResultData data = task.Result;

    // Update the UI using the data
}

タスクを使用すると、将来的にコードを .NET 4.5 にターゲットにする場合に、新しい async-await 機能を使用できるという利点も得られます。

于 2012-08-03T11:25:35.573 に答える