摘要:讀者的問題與解答 - 關於 DataGridView 的使用問題
原發問問題:
非常感
在DataGridView中放入2個textbox和一個DataGridViewComboBox,我是想實現通過DataGridViewComboBox下拉框選擇貨品,在另外2個textbox裡顯示該貨品的規格和單位,因為是初學者就去網上找資料發現一段代碼,但是在調試這段代碼時發現一個小小的問題,代碼如下
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("測試「)這行代碼,會隨著dataGridView的Row的增加彈出次數翻倍,舉例說明,我在
datagridview第一行的combobox裡選擇一個數據,messagebox.show就會彈出一次,但在第二行時就會2次,依次類推,想
回答
親愛的讀者您好,很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆如下:
圖表1
圖表2
圖表3
圖表4
圖表5
圖表6
程式範例執行結果依序如圖表1到6所示,當使用者變更下拉式清單的選項,也就是儲存格的值變更時,就會引發 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 類別有這種狀況,像是 DataGridViewCheckBoxColumn、DataGridViewImageColumn、DataGridViewButtonColumn、DataGridViewTextBoxColumn、DataGridViewLinkColumn 的資料行類別與一般的CheckBox、Image、Button、TextBox 與 LinkLabel 類別的用法不盡相同,在Visual C# 2005檔案IO與資料存取秘訣(簡體版為"Visual C# 2005文件IO與數據存取秘訣")一書中將有完整的章節來討論 DataGridView 控制項的用法,建議您一併列為參考。
章立民研究室