我有一个gridview,我试图从网格视图中加载带有列的列表,我得到了一个空引用异常

我已经试过了

    public static List<string> LoadStringList()
    {
        List<string> stringList = new List<string>();

        if (contactDataGridView.RowCount != 0)
        {
            for (int i = 0; i < contactDataGridView.Rows.Count; i++)
            {
                stringList.Add((string)contactDataGridView.Rows[i].Cells[2].Value);
            }

        }
        return stringList;
    }


我尝试了这个

    public static List<string> LoadStringList()
    {
        List<string> stringList = new List<string>();

        if (frmPRG299.mainForm.contactDataGridView.RowCount != 0)
        {
            for (int i = 0; i <frmPRG299.mainForm.contactDataGridView.Rows.Count; i++)
            {
                stringList.Add((string)frmPRG299.mainForm.contactDataGridView.Rows[i].Cells[2].Value);
            }

        }
        return stringList;
    }


进一步的解释

我有两种形式的frmMain和frmSub,其中gridview在frmMain中,而组合框在frmSub中,我需要调用函数LoadStringList()来填充组合框

最佳答案

使用允许您引用对象(在这种情况下为Control)的方法,并将对该对象的引用传递给该方法。
没有硬编码的对象引用,您的方法将更加灵活。

在这里,我将方法传递给DataGridView控件参考和一个从中提取当前值的单元格编号。

由于Cell.Value可能是null,因此您必须在尝试读取和/或将其转换为所需类型之前对其进行验证。

List<string> MyList = LoadStringList(this.dataGridView1, 2);


public List<string> LoadStringList(DataGridView dgv, int cell)
{
    if ((dgv == null) || (dgv.RowCount == 0)) return null;

    List<string> result = dgv.Rows.Cast< DataGridViewRow>()
        .Select(r => { return r.Cells[cell].Value != null
                            ? r.Cells[cell].Value.ToString()
                            : default; })
        .ToList();

    return result;
}


如果需要更通用的输入类型:

try
{
    List<int> MyList = LoadList<int>(this.dataGridView1, 2).ToList();
}
catch (Exception ex)
{
    //Handle the exception/Update the UI/Prompt the User
    Console.WriteLine(ex.Message);
}




public IEnumerable<T> LoadList<T>(DataGridView dgv, int cell)
{
    if ((dgv == null) || (dgv.RowCount == 0)) return null;

    IEnumerable<T> result = null;

    try
    {
        result = dgv.Rows.Cast<DataGridViewRow>()
                         .Select(r => { return r.Cells[cell].Value != null
                                   ? (T)Convert.ChangeType(r.Cells[cell].Value, typeof(T))
                                   : default;
                            })
                         .ToList();
    }
    catch (Exception ex) {
        //Manage the exception as required
        throw ex;
    }
    return result;
}

10-05 20:30