我正在填充一个带有组合框的列表,这是我按下按钮时动态创建的:
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
如果我检查调试器中的值,列表中有项目但它们都是null。我是否需要更新列表或其他内容?
答案 0 :(得分: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。