2017-09-20 11 views
0

リストボックスのSelectedIndexBackgroundWorkerの最後のインデックスにあるかどうかをチェックする必要がありますが、リストボックス(GUIスレッド上にあります)をチェックしているので、 BackgroundWorkerから私はこのエラーを取得する:Listbox.SelectedIndex == listbox.Items.Count from BackgroundWorker

System.InvalidOperationException: 'Cross-thread operation not valid: Control 'listBox1' accessed from a thread other than the thread it was created on.'

は、これは私のコードです:

if (listBox1.SelectedIndex == listBox1.Items.Count) 
{ 
//code here 
} 

は、どのように私はGUIのスレッドにすることなく、声明の仕事なら、これを作ることができますか?

答えて

-1

これは基本的に、別のスレッドからフォームプロパティにアクセスするときに発生します。そのため、この例外がスローされます。 UI操作は、所有スレッドで実行する必要があります。ここではその後、あなたの状態を

int intIndex = 0; 
int intCount = 0; 
     if (listBox1.InvokeRequired) 
     { 
      listBox1.Invoke(new MethodInvoker(delegate { intIndex = listBox1.SelectedIndex ; })); 
     } 

     if (listBox1.InvokeRequired) 
     { 
      listBox1.Invoke(new MethodInvoker(delegate { intCount = listBox1.Items.Count; })); 
     } 

を::

 if (intIndex == intCount) 
     { 
      // TODO: Business Logic 
     } 

をそれとも、このクイックフィックスを行うが、生産上のことはお勧めできませんが、あなたが開発に行うことができ

あなたはこれを行うことができます。これをコンストラクタに追加することができます。フォーム:

CheckForIllegalCrossThreadCalls = false; 
+0

いいえ、1つは 'CheckForIllegalCrossThreadCalls'を' false'に設定しないでください。間違ったスレッドからのコントロールを使用すると必然的に発生する問題を見つけるのが遅れるだけです。 –

+0

ありがとう、これは私が探していたものです。私が家に帰るときにそれを試してみよう! – Thomas

+0

さて、私はそれが動作する場合は、あなたが答えて、あなたの質問に答える場合はそれを受け入れることができます知って、感謝! @トーマス –