2014-09-06 40 views
0

我正在嘗試打印網格視圖。網格視圖值在打印功能中爲空

我就存在於這個功能printDocument1_PrintPage

所以我試圖用字符串替換this.GridView.Rows[rowCounter].Cells[0].Value.ToString()Hello此行

e.Graphics.DrawString 
      (
      this.GridView 
       .Rows[rowCounter] 
       .Cells[0] 
       .Value 
       .ToString(), 
      valueFont, 
      Brushes.Black, 
      realwidth, 
      realheight 
     ); 

得到null exception,異常進入和代碼工作。

然後,我做一個按鈕,該按鈕裏面我這樣做:

int r = 0; 
while (r < GridView.Rows.Count) 
{ 
    Console.WriteLine(GridView.Rows[r].Cells[0].Value); 
    r++; 
} 
return; 

爲什麼從打印功能我得到了訪問網格視圖時,該代碼工作正常,沒有例外

所以null異常,並從另一個函數訪問它時,它工作正常嗎?

回答

1

阿帕德·拉約什已經釘爲什麼值「有時」包含空,有時貌似不是這個原因..:

他們總是但Console.Write()靜靜地忽略空值,所以你的測試是誤導。

他們總是在最後一行包含空值的原因是DataGridview屬性AllowUserToAddRows,默認爲true。結果是一個空行插入到最後,這樣用戶可以輸入數據並添加更多行。

如果不想這樣做,您必須在填寫DGV之前關閉AllowUserToAddRows

爲了使應用程序更健壯,您可能希望在某個時候包含對null的檢查;這裏要考慮的主要問題是如何對待它們:忽略它們,如控制檯,告訴用戶並讓他/她繼續或不要將問題記錄到IT人員..?

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

是的,當我用'tostring'試過你的解決方案時,我在r = 234上得到了空的異常。你是否建議去除.tostring?或在調用.tostring之前驗證該值? – 2014-09-06 12:54:08

+0

我注意到問題總是出現在最後一行,例如,如果有1000行,999行變爲空,請問爲什麼?是否默認情況下網格視圖中有一行? – 2014-09-06 12:58:13

+0

我沒有使用C#做looong時間,所以我不知道GridView是如何填充的,但是,我猜你填充GridView時出現null,如果我是你,我會檢查該代碼,因爲你可能還有一個循環中的步驟超過需要。 – 2014-09-06 13:24:59

0

空對象不能有像.ToString()這樣的方法。如果GridView.Rows[r].Cells[0].Value中的值爲空,則不能使用.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。如果它是真的,那麼最後一行(新行)將總是返回空值。這可能是這個例外的原因。或者你可以避免最後一行打印for (int i=0; i< grid.Rows.Count-2;i++)。但是,我不認爲這是好的方法。如果檢查值的條件是否爲空,則只需放置即可。