【问题标题】:Why is the DataGridViewRow.Cells[1].Value returns null while it is not null?为什么 DataGridViewRow.Cells[1].Value 返回 null 而不是 null?
【发布时间】:2016-12-14 14:03:45
【问题描述】:

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

DataGridView1 有 2 列,这两列都是在设计时通过鼠标右键/编辑列设置的。
在 ctor DataGridView1 中填充了 11 条记录
运行应用程序时,11 条记录显示在 DataGridView1 中

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

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

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

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

这怎么可能?以及如何解决这个问题?

我尝试使用列名而不是索引,但结果保持不变,我仍然得到 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");
    }
}

【问题讨论】:

  • @GuidoG 我把评论删掉了,因为我意识到我错了!你试过跳过第一行吗?
  • @stuartd 我如何检查我的循环是否是标题行?
  • @stuartd 看来你到底在哪里,请看下面的答案

标签: c# winforms datagridview


【解决方案1】:

您需要添加此代码来处理标题行。在使用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;
  }

【讨论】:

  • 这行得通,但你能解释一下为什么我需要这样做吗?
  • null 表示尚未触及单元格值。 string.Empty 表示单元格值已设置,但为空,即 ""
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多