2016-12-14 74 views
1

考虑这个非常简单的测试项目:为什么DataGridViewRow.Cells [1] .Value在它不为空时返回null?

DataGridView1有2列,两者都是在设计时通过右键/编辑列进行设置。
在构造函数DataGridView1填充了11条记录
当运行应用程序的共有11条记录中DataGridView1

表示,现在的问题。
当你点击该按钮,方法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"); 
    } 
} 
+0

@GuidoG当我意识到自己错了!你有没有尝试跳过第一行? –

+0

@stuartd如何检查我的循环是否为标题行? – GuidoG

+0

@stuartd看起来像你在哪里毕竟,看到下面的答案 – GuidoG

回答

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; 
    } 
+0

这有效,但你能解释一下为什么我需要这样做吗? – GuidoG

相关问题