我有一个相当简单的例程,偶尔会导致空引用异常,而且我无法确定问题的原因或解决方案。
目标是一个功能,它将清除然后填充列表视图,如果指定了选定的项目条件(通常是字符串或内部对象ID),则该项目将在列表视图中被选中。
this.listView.Items.Clear();
foreach(var obj in objectList)
{
var lvi = new ListViewItem(new[] {obj.Column1, obj.Column2}) { Tag = obj };
this.listView.Items.Add(lvi);
if (obj.Column1 == selectedData)
{
lvi.Selected = true; //Occasional null reference
}
}
此时的堆栈跟踪产生:
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Windows.Forms.ListViewItem.set_Selected(Boolean value)
at <method of above code> @ <line number for "Selected = true">
编辑:我不认为这是建议问题的重复,因为我的直接控制对象都不为空。 ListViewItem对象内部的东西有时为null,导致与属性Selected的交互错误。
虽然我不知道.Add的内部逻辑是做什么的,但我怀疑它可以创建一个新对象,因此应该使用它的返回值。
this.listView.Items.Clear();
foreach(var obj in objectList)
{
var lvi = this.listView.Items.Add(new ListViewItem(new[] {obj.Column1, obj.Column2}) { Tag = obj });
if (obj.Column1 == selectedData)
{
lvi.Selected = true;
}
}