開発環境は Visual Studio Express 2017 for Windows Desktop
言語はC#、.NET Framework 4.7.2を使用しています。
入力可能なコンボボックスをもつ、DataGridViewを作成しました。
EditingControlShowingイベントでコンボボックスのDropDownStyleを設定しています。
C#
1 public Form1() 2 { 3 InitializeComponent(); 4 5 //DataTableを作成する 6 DataTable dt = new DataTable(); 7 //文字列型のWeek列を追加する 8 dt.Columns.Add("Week", typeof(string)); 9 //Week列に日曜日~土曜日のデータを追加する 10 dt.Rows.Add("日曜日"); 11 dt.Rows.Add("月曜日"); 12 dt.Rows.Add("火曜日"); 13 //DataGridViewにデータソースを設定する 14 dataGridView1.DataSource = dt; 15 16 //DataGridViewComboBoxColumnを作成 17 DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn(); 18 //ComboBoxのリストに表示する項目を設定する 19 column.Items.Add("日曜日"); 20 column.Items.Add("月曜日"); 21 column.Items.Add("火曜日"); 22 column.Items.Add("水曜日"); 23 column.Items.Add("木曜日"); 24 column.Items.Add("金曜日"); 25 column.Items.Add("土曜日"); 26 27 //DataGridView1に現在存在しているWeek列と 28 // 今作成したDataGridViewComboBoxColumnを入れ替える 29 //表示する列の名前を設定する 30 column.DataPropertyName = dataGridView1.Columns["Week"].DataPropertyName; 31 //以下のようにしても同じ 32 //column.DataPropertyName = "Week"; 33 //現在Week列が存在している位置に挿入する 34 dataGridView1.Columns.Insert(dataGridView1.Columns["Week"].Index, column); 35 //今までのWeek列を削除する 36 dataGridView1.Columns.Remove("Week"); 37 //挿入した列の名前を「Week」とする 38 column.Name = "Week"; 39 } 40 41 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 42 { 43 if (e.Control is DataGridViewComboBoxEditingControl) 44 { 45 //該当する列か調べる 46 DataGridView dgv = (DataGridView)sender; 47 if (dgv.CurrentCell.OwningColumn.Name == "Week") 48 { 49 //編集のために表示されているコントロールを取得 50 DataGridViewComboBoxEditingControl cb = 51 (DataGridViewComboBoxEditingControl)e.Control; 52 cb.DropDownStyle = ComboBoxStyle.DropDown; 53 } 54 } 55 }
また、DataGridViewでは、コンボボックスの選択肢にない項目が入力されていると、エラーとなってしまうため
こちらを参考にし、CellValidatingイベントでコンボボックスの選択肢に追加するようにしています。
C#
1 private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 2 { 3 DataGridView dgv = (DataGridView)sender; 4 //該当する列か調べる 5 if (dgv.Columns[e.ColumnIndex].Name == "Week" && 6 dgv.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn) 7 { 8 DataGridViewComboBoxColumn cbc = 9 (DataGridViewComboBoxColumn)dgv.Columns[e.ColumnIndex]; 10 //コンボボックスの項目に追加する 11 if (!cbc.Items.Contains(e.FormattedValue)) 12 { 13 cbc.Items.Add(e.FormattedValue); 14 } 15 //セルの値を設定しないと、元に戻ってしまう 16 dgv[e.ColumnIndex, e.RowIndex].Value = e.FormattedValue; 17 } 18 }
Loadイベントでコンボボックスの選択肢にない初期値を設定したときのコードです。
C#
1 strItem[0] = "strItem001"; 2 strItem[1] = "strItem002"; 3 strItem[2] = "strItem003"; 4 strItem[3] = "strItem004"; 5 6 private void Form1_Load(object sender, EventArgs e) 7 { 8 string str; 9 int row = 0, col = 0; 10 11 // 行数分 12 foreach (DataGridViewRow rowData in dataGridView1.Rows) 13 { 14 //コンボボックスの項目に追加する 15 DataGridViewComboBoxCell cmb = (DataGridViewComboBoxCell)rowData.Cells[col]; 16 str = ""; 17 if (strItem[row] != null) 18 { 19 str = strItem[row]; 20 } 21 if (!cmb.Items.Contains(str)) { cmb.Items.Add(str); } 22 cmb.Value = str; 23 row++; 24 } 25 }
この後、コンボボックスを操作すると、値が1件目のものに変わってしまうという問題が起きています。
コンボボックスの値を勝手に変更させない方法について、ご教示いただけないでしょうか。
検証とか全くしてない単なる思い付きですが・・・
構成を以下のようにしてデータソースに追加したらどうなりますか?
データソース (DataTable とか List<T>) ⇔ BindingSource ⇔ ComboBox
データの追加は BindingSource を操作して可能です。
コメントありがとうございます。
下記のようにして、BindingSouceを使う方法を試してみたのですが、
状況は変わりませんでした..。
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = dt;
dataGridView1.DataSource = bindingSource;
回答1件
あなたの回答
tips
プレビュー