考虑这个非常简单的测试项目:
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");
}
}
2条答案
按热度按时间2j4z5cfb1#
你需要添加这段代码来处理表头行,在使用
Tostring()
之前,你需要检查一个单元格是否有值(即不为空);如果单元格为空,则ToString()
将抛出异常。qxsslcnc2#