我正在尝试循环遍历行并获取其索引(SQL中的主键)。我在“this.SelectRowIndexes.Add(ResourceKey)”上获得了一个NRE。我无法弄清楚为什么它会重要,我该如何解决这个问题?
CODE:
private void GetIndexes()
{
List<int> SelectRowIndexes = new List<int>();
for (int i = 0; i < gridViewRecords.Rows.Count; i++)
{
DataRowView drv = (DataRowView)gridViewRecords.CurrentRow.DataBoundItem;
DataRow selectedRow = drv.Row;
ResourceKey = Convert.ToInt32(selectedRow["ResourceAndInstallKey"]);
this.SelectRowIndexes.Add(ResourceKey);
}
}
我在课堂上也有它(这已经过了很多故障排除,所以我的代码看起来很糟糕)
public List<int> SelectRowIndexes { get; set; }
我之前有这个。几个答案引用了这段代码。我改变了我的意思,因为if-else实际上用于其他东西,现在已被删除
if (this.SelectRowIndexes == null)
{
this.SelectRowIndexes.Add(ResourceKey);
}
else
{
this.SelectRowIndexes.Add(ResourceKey);
}
答案 0 :(得分:2)
如果SelectRowIndexes为null,则无法向列表中添加任何内容。首先需要使用
初始化一个空列表this.SelectRowIndexes = new List<int>();
答案 1 :(得分:1)
您实例化一个局部变量
List<int> SelectRowIndexes = new List<int>();
然后你要添加你的类属性/字段this.SelectedRowIndexes你很可能不会在任何地方分配它并且它是null并且你得到NRE。
this.SelectRowIndexes.Add(ResourceKey);
改变这个
private void GetIndexes()
{
this.SelectRowIndexes = new List<int>();
for (int i = 0; i < gridViewRecords.Rows.Count; i++)
{
DataRowView drv = (DataRowView)gridViewRecords.CurrentRow.DataBoundItem;
DataRow selectedRow = drv.Row;
ResourceKey = Convert.ToInt32(selectedRow["ResourceAndInstallKey"]);
this.SelectRowIndexes.Add(ResourceKey);
}
}
答案 2 :(得分:1)
如果this.SelectRowIndexes
为空,您实际想做什么?目前,您只是无条件地在其上调用Add
,因为if
语句的两个分支都做同样的事情。
请注意,如果您为其分配了新值,那么不会为空 - 但是在此行中,您将声明一个新的局部变量叫SelectRowIndexes
:
List<int> SelectRowIndexes = new List<int>();
......然后你完全无视。也许您打算设置属性/字段的值?
SelectRowIndexes = new List<int>();
有了这个改变,你应该避免例外 - 但你仍然会有基本上破坏的代码。你几乎可以肯定只是摆脱if
检查......它现在对你没有任何好处。
但是,我建议你应该为resourceKey
声明一个单独的局部变量 - 你在循环中更新实例变量的事实有点奇怪...因为你根本没有使用你的循环索引...你在循环的每次迭代中都做同样的事情,使用当前行而不是行{{1} }。这是故意的吗?
从根本上说,您可能想再次启动此代码......看起来您可能只想使用LINQ:
i
答案 3 :(得分:1)
this
关键字允许您访问类范围内名为SelectRowIndexes
的成员。该成员可能尚未初始化。删除List<int>
类型声明,它将是完美的。
private List<int> SelectRowIndexes;
private void GetIndexes()
{
SelectRowIndexes = new List<int>();
for (int i = 0; i < gridViewRecords.Rows.Count; i++)
{
DataRowView drv = (DataRowView)gridViewRecords.CurrentRow.DataBoundItem;
DataRow selectedRow = drv.Row;
ResourceKey = Convert.ToInt32(selectedRow["ResourceAndInstallKey"]);
if (this.SelectRowIndexes == null)
{
this.SelectRowIndexes.Add(ResourceKey);
}
else
{
this.SelectRowIndexes.Add(ResourceKey);
}
}
}