基于List <int>

时间:2015-05-06 16:16:36

标签: c# winforms nullreferenceexception

我正在尝试循环遍历行并获取其索引(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);
}

4 个答案:

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