网格视图值在打印功能中变为空

时间:2014-09-06 12:34:06

标签: c# winforms printing

我正在尝试打印网格视图。

我在这一行得到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异常并且当从另一个函数访问它时它工作正常呢?

3 个答案:

答案 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,在第二次尝试中,您只引用了该值。我猜您nullValue至少一行,而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,则只需要放置。