1

我正在用组合框填充一个列表,当按下按钮时我会动态创建组合框,如下所示:

private void populatePageTwo()
    {
        ComboBox noteBox = new ComboBox();
        noteBox.Location = new Point(50, 15*(comboBoxCount+1)+(20*comboBoxCount));
        noteBox.Size = new Size(100, 20);
        fillNoteComboBox(noteBox);
        comboBoxNoteList.Add(noteBox);

        comboBoxCount++;
    }

后来,我在另一个线程中进行了以下检查:

Note selectedNote = (Note)this.Invoke((MethodInvoker)delegate()
                {
                    selectedNote = (Note)comboBoxNoteList[i].SelectedItem;
                });

但是我得到一个NullReferenceException,如果我检查调试器中的值,列表中有项目但它们都是空的。我需要更新列表吗?

4

1 回答 1

2

这可能是因为您的 Invoke 调用返回 null。来自MSDN:

返回值 类型:System.Object 正在调用的委托的返回值,如果委托没有返回值,则返回 null。

您可以使用 Lambda 表达式,这是这种情况下最简单的方法:

selectedNote = (Note)Invoke(new Func<Note>(() => (Note)comboBoxNoteList[i].SelectedItem));

编辑:当您的函数占用多行时,替代方法(您的)很有用。这是语法:

var noteText = (string)Invoke(new Func<String>(delegate 
    { 
        var note = (Note)comboBoxNoteList[i].SelectedItem;
        return note.Text; 
    })); 

您在调试器中看到 null 项的原因可能是因为调试器在当前线程的上下文中运行,而不是接口线程,从而导致跨线程问题返回 null。

于 2013-09-19T22:24:12.427 回答