質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

7195閲覧

入力可能なコンボボックスを持つDataGridViewで、コンボボックスにない選択肢を設定する方法について

Taffy

総合スコア33

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/10/06 04:35

開発環境は 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件目のものに変わってしまうという問題が起きています。
コンボボックスの値を勝手に変更させない方法について、ご教示いただけないでしょうか。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/07 01:02 編集

検証とか全くしてない単なる思い付きですが・・・ 構成を以下のようにしてデータソースに追加したらどうなりますか? データソース (DataTable とか List<T>) ⇔ BindingSource ⇔ ComboBox データの追加は BindingSource を操作して可能です。
Taffy

2020/10/07 02:58

コメントありがとうございます。 下記のようにして、BindingSouceを使う方法を試してみたのですが、 状況は変わりませんでした..。 BindingSource bindingSource = new BindingSource(); bindingSource.DataSource = dt; dataGridView1.DataSource = bindingSource;
guest

回答1

0

ベストアンサー

csharp

1 //コンボボックスの項目に追加する 2 DataGridViewComboBoxCell cmb = (DataGridViewComboBoxCell)rowData.Cells[col]; 3 str = ""; 4 if (strItem[row] != null) 5 { 6 str = strItem[row]; 7 } 8 if (!cmb.Items.Contains(str)) { cmb.Items.Add(str); } 9 cmb.Value = str; 10 row++;

DataGridViewComboBoxCellじゃなくて、DataGridViewComboBoxColumn のItemを追加しないとまずいような。

投稿2020/10/07 00:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taffy

2020/10/07 02:57

DataGridViewComboBoxColumn のItemを追加するように対応して、解決しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問