0

WinForms アプリケーションでコンボ ボックスを変更しようとしていますが、奇妙な動作が発生します。私は2つの方法を試しています:

呼び出す必要があるメソッドは次のとおりです。

private void modifyCombo(ClassInfoHolder oldClass, ClassInfoHolder newClass) {
    this.monitoredComboBox.Items[monitoredComboBox.Items.IndexOf(oldClass)] = newClass;
}

GUI スレッドからこのメソッドを呼び出す 2 つの異なる方法を試しています。これは機能します:

delegate void modifyComboCollection(ClassInfoHolder oldClass, ClassInfoHolder newClass);

private void modifySecondTabComboBox(ClassInfoHolder oldClass, ClassInfoHolder newClass) {
    if (monitoredComboBox.InvokeRequired) {
        modifyComboCollection m = new modifyComboCollection(modifyCombo);
        this.BeginInvoke(m, oldClass, newClass);
    } else {
        // no need for Invoke
        modifyCombo(oldClass, newClass);
    }
}

これにより、TargetInvocationException がスローされます。

this.BeginInvoke(new Action(() => {
    modifyCombo(oldClass, newClass);
}));

2 番目の例の方がはるかに明確なので、使用したいと思いますが、最初の例が問題なく動作するのに、なぜエラーがスローされるのか完全にはわかりません。最初の例では、modifyComboメソッドを呼び出して、オブジェクトの を正しく返しIndexOfます。2 番目の例は-1から返されIndexOfます。

編集:これはスタックトレースのペーストビンリンクです。 http://pastebin.com/TwfUDw4u

4

1 に答える 1

0

this.BeginInvoke(m, new[] {oldClass, newClass});

ところで。Invoke を使用する前に if (this.IsHandleCreated && !this.IsDisposed) をテストすることをお勧めします。

于 2010-11-24T17:14:07.483 に答える