2016-12-14 78 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

相關問題