2016-09-20 83 views
3
public delegate void MyEventHandler(object sender, DataGridViewCellEventArgs e); 
public event MyEventHandler SomethingHappened;  

private void dataGridViewCargo_CellContentClick_1(object sender, DataGridViewCellEventArgs e) 
{ 
    if (e.RowIndex >= 0) 
    { 
     DataGridViewRow rowID = this.dataGridViewCargo.Rows[e.RowIndex]; 
     cargoDisplayMessageIdTextBox.Text = rowID.Cells["iDDataGridViewTextBoxColumn"].Value.ToString(); 

     DataGridViewRow rowSender = this.dataGridViewCargo.Rows[e.RowIndex]; 
     cargoDisplaySubjectTextBox.Text = rowSender.Cells["subjectDataGridViewTextBoxColumn"].Value.ToString(); 

    } 
} 



protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    Invoke(new MyEventHandler(SomethingHappened)); 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

第一部分在我選擇行時更新我的​​文本框。第二部分是對事件處理程序的嘗試。我想通過鍵盤瀏覽網格來更新文本框。所以無論藍色突出顯示的行都會自動填充文本框。通過使用箭頭鍵導航DataGridView來更新文本框

我試圖通過將其包含在dataGridViewCargo_CellContentClick中來調用事件處理程序,但發件人和e沒有通過並且我得到參數計數不匹配錯誤或委託給實例方法不能具有null'this'。這個想法是通過按下一個按鈕來調用CellContentClick事件。

任何幫助都會很友善。

+0

CellContentClick實際上是一個不錯的選擇,因爲您必須擊中實際的內容。爲什麼你需要ProcessCmdKey? dgv應該自己做,除非它被解散。只需編寫CurrentCellChanged事件即可! – TaW

回答

2

當您使用鼠標或箭頭鍵在DataGridView的行之間進行數據綁定時,其數據源的位置發生更改,並且綁定到同一數據源的所有控件將顯示來自新位置的值。

此外,如果您不使用數據綁定SelectionChanged事件DataGridView將被引發並可用於更新控件。

所以,你可以使用這些選項來解決這個問題:

  • 綁定那些TextBox控制到相同的數據來源,DataGridView用途。

  • 使用SelectionChanged事件DataGridView

如果您綁定DataGridViewDataSource,那麼你可以簡單地使用數據綁定過你TextBox控制。通過點擊每行,將這些控件綁定到您想要顯示的數據源字段就足夠了。您可以執行數據綁定使用設計或使用代碼:

var data = GetDataFromSomeShere(); 
dataGridViewCargo.DataSource = data; 
cargoDisplayMessageIdTextBox.DataBindings.Add("Text", data, "ID"); 
cargoDisplaySubjectTextBox.DataBindings.Add("Text", data, "Subject"); 

如果你不使用數據綁定,你可以簡單地使用SelectionChanged事件的DataGridView和使用的DataGridViewCurrentRow屬性來查找這些字段並更新TextBox控制:

private void dataGridViewCargo_SelectionChanged(object sender, EventArgs e) 
{ 
    var row = dataGridViewCargo.CurrentRow; 
    cargoDisplayMessageIdTextBox.Text = 
     row.Cells["iDDataGridViewTextBoxColumn"].Value.ToString(); 
    cargoDisplaySubjectTextBox.Text = 
     row .Cells["subjectDataGridViewTextBoxColumn"].Value.ToString(); 
} 

使用數據綁定(第一個選項)是首選。

+0

謝謝。我使用了建議的數據綁定方法,但是我嘗試使用SelectionChanged替代方法,但是當我編寫private void dataGridViewCargo_SelectionChanged(object sender,EventArgs e)時,似乎沒有對我的dataGridViewCargo的引用。你知道這可能是爲什麼嗎? – Connor

+1

不客氣。對於第二個選項,您不應該忘記使用代碼或設計器將事件處理程序附加到事件。另外請確保您在該網格對該方法可見的範圍內編寫事件處理程序。 –