c# - 为什么 DataGridViewRow.Cells[1].Value 返回 null 而不是 null?

标签 c# winforms datagridview

考虑这个非常简单的测试项目:

DataGridView1 有 2 列,均在设计时通过鼠标右键/编辑列进行设置。
在构造函数 DataGridView1 中填充了 11 条记录
运行应用程序时,DataGridView1 中显示 11 条记录

现在解决问题。
当您单击该按钮时,将调用方法 CreateResultDataTable() 并在

上引发空引用异常
row.Cells[1].Value.ToString()  

该值似乎为空,但我知道它不是。

现在对于奇怪的部分,当调试时,我将鼠标移到行上,我看到它有 2 个单元格。因此,我将鼠标移到它上面并打开单元格枚举,然后打开第二个单元格,实际上该值为空。
所以现在我将鼠标移到 dataGridView1.Rows 上,然后将鼠标移到 11 行中的第一行上,然后再次移到单元格上并打开枚举,当我进入第二个单元格时,该值不为 NULL!
它们不是同一个对象吗?

怎么会这样呢?以及如何解决这个问题?

我尝试使用列名而不是索引,但结果保持不变,我仍然收到 nulreference 异常。

以下是该程序的完整代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        LoadMapping();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        dataGridView2.DataSource = CreateResultDataTable();
    }

    private DataTable CreateResultDataTable()
    {
        DataTable Result = new DataTable();
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            Result.Columns.Add(row.Cells[1].Value.ToString()); // why is Value null here ??
        }
        return Result;
    }

    private void LoadMapping()
    {
        dataGridView1.Rows.Add("Message//Header//Message_Type", "MessageType");
        dataGridView1.Rows.Add("Message//Header//Creation_Date", "MessageDate");
        dataGridView1.Rows.Add("Message//Header//Sequence_Number", "MessageSequenceNumber");
        dataGridView1.Rows.Add("Message//Header//Sender", "MessageSender");
        dataGridView1.Rows.Add("Message//Header//Receiver", "MessageReceiver");
        dataGridView1.Rows.Add("Message//Detail//Visit//Transport_Reference_Out", "LotNumber");
        dataGridView1.Rows.Add("Message//Detail//Visit//Licenseplate", "TruckPlate");
        dataGridView1.Rows.Add("Message//Detail//Visit//Cargo//VIN", "ChassisNumber");
        dataGridView1.Rows.Add("Message//Detail//Visit//Cargo//Make", "BrandName");
        dataGridView1.Rows.Add("Message//Detail//Visit//Cargo//LoadDate", "LaadDatum");
    }
}

最佳答案

您需要添加此代码来处理标题行。在使用 Tostring() 之前,您必须检查单元格是否有值(即不为空);如果单元格为空,则 ToString() 将抛出异常。

  private DataTable CreateResultDataTable()
  {
        DataTable Result = new DataTable();
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            var cell = row.Cells[1].Value;
            if (cell != null) {
                Result.Columns.Add(cell.ToString()); // Why is Value null here??
            }
        }
        return Result;
  }

关于c# - 为什么 DataGridViewRow.Cells[1].Value 返回 null 而不是 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41144567/

相关文章:

c# - 如何使用 Moq 传递列表参数

c# - 如何在没有重复记录的情况下使用 DataTable.Load(DataReader) 重新加载 DataGridView

c# - 动态 PropertyGrid 属性

c# - 从 double 转换为 int 的最佳(最安全)方法

c# - Spring.NET 等效于 Java Spring 数据访问用法

winforms - 如何使用上下文菜单关闭项禁用 KryptonPage 的删除按钮?

c# - 如何知道特定文本框是否有变化,文本框是在C#中动态创建的

c# - 是否有必要在控制处理之前明确清除数据绑定(bind)?

.net - 实时数据 GridView ?

mysql - 是否可以使用 2 个不同的表更新某个列值并删除它?