我正在尝试打印网格视图。
我在这一行得到null exception
e.Graphics.DrawString
(
this.GridView
.Rows[rowCounter]
.Cells[0]
.Value
.ToString(),
valueFont,
Brushes.Black,
realwidth,
realheight
);
存在于此函数printDocument1_PrintPage
所以我尝试用this.GridView.Rows[rowCounter].Cells[0].Value.ToString()
之类的字符串替换Hello
,例外情况就是这样,代码就可以了。
然后,我做了一个按钮,在那个按钮内我做了这个:
int r = 0;
while (r < GridView.Rows.Count)
{
Console.WriteLine(GridView.Rows[r].Cells[0].Value);
r++;
}
return;
并且该代码可以正常运行
那么为什么当从打印函数访问网格视图时我得到null异常并且当从另一个函数访问它时它工作正常呢?
答案 0 :(得分:2)
您没有编写等效代码。
e.Graphics.DrawString
(
this.GridView
.Rows[rowCounter]
.Cells[0]
.Value
.ToString(),
valueFont,
Brushes.Black,
realwidth,
realheight
);
作为你的第一次尝试,你有
int r = 0;
while (r < GridView.Rows.Count)
{
Console.WriteLine(GridView.Rows[r].Cells[0].Value);
r++;
}
return;
作为你的第二次尝试。在第一次尝试中,您还调用了ToString
,在第二次尝试中,您只引用了该值。我猜您null
为Value
至少一行,而null
没有一个名为ToString
的方法。那应该是问题所在。您可以使用以下代码轻松测试我是对还是错:
int r = 0;
while (r < GridView.Rows.Count)
{
Console.WriteLine(GridView.Rows[r].Cells[0].Value.ToString());
r++;
}
return;
答案 1 :(得分:1)
Lajos Arpad已经确定了为什么价值观有时候会出现这种情况。包含null,有时看似不...:
他们总是这样做,但Console.Write()
悄然忽略空值,因此你的测试会产生误导。
它们始终在最后一行中包含空值的原因是DataGridview
属性AllowUserToAddRows
,默认情况下为true。结果是在末尾插入一个空行,以便用户可以输入数据并添加更多行。
如果不需要,您必须在填写DGV之前关闭AllowUserToAddRows
。
为了使应用程序更加健壮,您可能希望在某些时候包含对null的检查;这里要考虑的主要问题是如何对待它们:像控制台一样忽略它们,告诉用户让他/她继续或不继续或者将问题记录给IT人员。?
答案 2 :(得分:0)
Null对象不能有像.ToString()
这样的方法。如果GridView.Rows[r].Cells[0].Value
中的值为null,则无法使用.ToString()
方法将其转换为字符串。你需要在这里提出一个条件。
if (GridView.Rows[r].Cells[0].Value != null)
e.Graphics.DrawString
(
this.GridView
.Rows[rowCounter]
.Cells[0]
.Value
.ToString(),
valueFont,
Brushes.Black,
realwidth,
realheight
);
确保AllowUserToAddRow
属性为false。如果为true,则最后一行(New Row)将始终返回null值。这可能是这种例外的原因。或者您可以避免最后一行打印for (int i=0; i< grid.Rows.Count-2;i++)
。但是,我不认为这是好方法。如果条件检查值为null,则只需要放置。