0

Visual Studio プロジェクトに、4 つのタブを持つ TabControl を含むフォームがあります。

フォームをロードするとき、3 つのタブのみを用意します。

ユーザーが 4 番目のタブに切り替えた場合、タブにデータを表示する前に計算を行う必要があります。

切り替えると、以下に示すようなグラフィック アーティファクトが発生します。

ここに画像の説明を入力

(ぼやけたものを見ないでください。真ん中の白いストライプと右側の切り取られたグラフィックを見てください)

計算を行う前に Suspending Layout を試しましたが、おそらく TabControl.SelectedIndexChanged で描画が既に開始されています。いいえ、変更イベントはありません。

この問題を解決するにはどうすればよいですか? おそらく別のスレッドを使用せずに。

4

1 に答える 1

2

計算が完了した後にアーティファクトが自動的に修正されると言うので、これは、計算に CPU を費やしているため、UI スレッドに画面を更新する機会を与えていないことが原因である可能性が最も高いです。この問題を解決するには、何らかのスレッドを使用する必要があります。

Windows フォームには、BackgroundWorkerこの種のタスクを非常に簡単にする優れたコントロールが含まれています。コントロールをツールボックスからフォーム デザイナーにドラッグし、DoWorkおよびRunWorkerCompletedイベントのイベント ハンドラーを作成するだけです。計算をDoWorkハンドラーに入れ、計算がハンドラーで完了した後に発生する必要がある UI の更新を行いますRunWorkerCompleted(ハンドラーから UI 要素にアクセスしないようにすることが重要ですDoWork)。

簡単なコード サンプルを次に示します。

  public partial class Form1 : Form
  {
    private MyCalculationState _state;

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
      _state = new MyCalculationState();

      // Do some calculations
      _state.Value = 5;
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      // Update the UI after calculations are complete
      textBox1.Text = _state.Value.ToString();
    }
  }
于 2012-09-21T14:56:01.690 に答える