讀者的問題與解答 - 關於 DataGridView 的使用問題

摘要:讀者的問題與解答 - 關於 DataGridView 的使用問題

原發問問題:

非常感謝章老師的回覆,我想請教的問題是這樣:
DataGridView中放入2textbox和一個DataGridViewComboBox,我是想實現通過DataGridViewComboBox下拉框選擇貨品,在另外2textbox裡顯示該貨品的規格和單位,因為是初學者就去網上找資料發現一段代碼,但是在調試這段代碼時發現一個小小的問題,代碼如下

private DataGridView dataGridView1 = new DataGridView();

private void AddColorColumn()
{
    DataGridViewComboBoxColumn comboBoxColumn =
        new DataGridViewComboBoxColumn();
    comboBoxColumn.Items.AddRange(
        Color.Red, Color.Yellow, Color.Green, Color.Blue);
    comboBoxColumn.ValueType = typeof(Color);
    dataGridView1.Columns.Add(comboBoxColumn);
    dataGridView1.EditingControlShowing +=
        new DataGridViewEditingControlShowingEventHandler(
        dataGridView1_EditingControlShowing);
}

private void dataGridView1_EditingControlShowing(object sender,
    DataGridViewEditingControlShowingEventArgs e)
{
    ((ComboBox)e.Control).SelectedIndexChanged +=
        new EventHandler(ComboBox_SelectedIndexChanged);
}

private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    //
我在這裡添加了一行代碼 messageBox.show("測試);

    ((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem;
}

在調試的時候發現,我添加的那個 messageBox.show("測試)這行代碼,會隨著dataGridViewRow的增加彈出次數翻倍,舉例說明,我在
datagridview
第一行的combobox裡選擇一個數據,messagebox.show就會彈出一次,但在第二行時就會2次,依次類推,想麻煩章老師看一下,為什麼會出現這種效果,這裡先謝過。

 

回答

 

親愛的讀者您好,很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆如下:

 

 


圖表
1

 

 


圖表
2

 

 


圖表
3

 

 


圖表
4

 

 


圖表
5

 

 


圖表
6

 

程式範例執行結果依序如圖表16所示,當使用者變更下拉式清單的選項,也就是儲存格的值變更時,就會引發 DataGridView 控制項的 CellValueChanged 事件。


請替事件處理常式
dataGridView1_CellValueChanged 撰寫下列程式碼,藉此顯示訊息方塊提示使用者已經進入事件處理常式之程式的處理範圍,並設定使用者選取之下拉式清單的背景顏色:

private void dataGridView1_CellValueChanged(object sender,
  DataGridViewCellEventArgs e)
{
 MessageBox.Show("
進入 CellValueChanged事件處理常式!"
);
 
 if (e.ColumnIndex == 0)
 {
  this.dataGridView1.Rows[e.RowIndex].Cells[0].Style.BackColor =
    (Color)this.dataGridView1.Rows[e.RowIndex].Cells[0].Value;
 }
}

您或許會問,為什麼要使用 DataGridView 控制項而不是DataGridViewComboBoxColumn 類別的事件,這是由於 DataGridViewComboBoxColumn 類別沒有提供對應的事件來觸發下拉式清單的 SelectedIndexChanged 事件。更何況 DataGridView 控制項不會針對每一列資料特別指派 Id 值給下拉式清單來判斷究竟是哪一列的下拉式清單被點選,換句話說,在 DataGridView 控制項裡的每一列資料所使用的下拉式清單名稱都一樣。

依照您的寫法,當建立下拉式清單的 SelectedIndexChanged 事件與事件處理常式之間的關連之後,由於每一列資料所使用的下拉式清單名稱都相同,所以只要觸發任一個下拉式清單的 SelectedIndexChanged 事件,都會自動連結到同一個事件處理常式,自然就出現與資料列數目相等的訊息方塊在畫面上。為瞭解決這個問題,必須透過 DataGridView 控制項的事件來確認究竟是哪一列的下拉式清單之選擇項目改變了。

特別要提醒的是,不只是 DataGridViewComboBoxColumn 類別有這種狀況,像是 DataGridViewCheckBoxColumnDataGridViewImageColumnDataGridViewButtonColumnDataGridViewTextBoxColumnDataGridViewLinkColumn 的資料行類別與一般的CheckBoxImageButtonTextBox  LinkLabel 類別的用法不盡相同,在Visual C# 2005檔案IO與資料存取秘訣(簡體版為"Visual C# 2005文件IO與數據存取秘訣")一書中將有完整的章節來討論 DataGridView 控制項的用法,建議您一併列為參考。

章立民研究室 2006/12/29