winforms 为什么DataGridViewRow.Cells [1]的.值不是空值却返回空值?

44u64gxh  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(266)

考虑这个非常简单的测试项目:
DataGridView 1有2个数据行,两者都是在设计阶段以鼠标器右击/编辑数据行来设定。
在ctor中,DataGridView 1填充了11条记录
运行应用程序时,11条记录显示在DataGridView 1中
现在来谈谈问题。
当您按一下按钮时,会呼叫CreateResultDataTable()方法,并在

row.Cells[1].Value.ToString()

值显示为空,而我知道它不是。
奇怪的是,调试时,我将鼠标移到行上,看到该行有2个单元格。因此,我将鼠标移到该行上,打开单元格枚举,然后打开第二个单元格,值确实为空。
现在我将鼠标移到dataGridView1.Rows上,然后将鼠标移到11行中的第一行上,再移到单元格上并打开枚举,当我进入第二个单元格时,值为NOT 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");
    }
}
2j4z5cfb

2j4z5cfb1#

你需要添加这段代码来处理表头行,在使用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;
  }
qxsslcnc

qxsslcnc2#

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

相关问题