0

我正在尝试修改 WinForms 应用程序上的组合框,但出现了一些奇怪的行为。我正在尝试两种方法:

这是我需要调用的方法:

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

我正在尝试两种不同的方法来从 GUI 线程调用此方法。这个有效:

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);
}));

我更喜欢使用第二个,因为它更清晰,但我不完全确定为什么当第一个示例运行良好时它会引发错误。第一个示例调用该modifyCombo方法并正确返回IndexOf对象的。第二个例子是-1IndexOf.

编辑:这是堆栈跟踪的 pastebin 链接。 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 回答