実現したいこと
C#のDatagridを使用したコンボボックス付きの表からデータを取り出したい。
ここに実現したいことを箇条書きで書いてください。
- コンボボックスを選ぶとそれに応じてテキストファイルから読み込んだ項目の表が作成される。
- その一部はコンボボックス付きの表となっている。
- そのコンボボックスを選択し終えてボタンを押すと、コンボボックスで選んだ項目をリストとして保存した後、表を全消去して再度コンボボックスなしの表として作り直すというプログラムを作成しています。
- 「コンボボックスで選んだ項目をリストとして保存」の部分が上手くいかずに困っています。
前提
・言語:C#
・OS:Windows 10
・開発環境:visual studio 2022(.NET framework4.8)
あるソフトのスクリプト機能で動くdllを作成しています。
実行してもエラーは出ませんが、コンボボックスの列で選んだ項目をリストに保存したいのに、別の列の値が保存されてしまいます。
コンボボックス付きの列は列番号がないのか選択できていないようです。
該当のソースコード
C#
1private void site_tb_Combo_SelectionChanged(object sender, SelectionChangedEventArgs e) 2 { 3 〈省略〉 4 5 D_table.ItemsSource = null; 6 // 既存の列をクリア 7 D_table.Columns.Clear(); 8 9 // データソースとしてDataTableを使用 10 DataTable dataTable = new DataTable(); 11 dataTable.Columns.Add("評価項目", typeof(string)); 12 dataTable.Columns.Add("評価指標", typeof(string)); 13 dataTable.Columns.Add("許容値1", typeof(string)); 14 dataTable.Columns.Add("許容値2", typeof(string)); 15 dataTable.Columns.Add("判定", typeof(string)); 16 17 // データを追加 18 for (int i = 0; i < structureList.Count; i++) 19 { 20 dataTable.Rows.Add(structureList[i], indexList[i], constraints1List[i], constraints2List[i]); 21 } 22 23 // DataGridにデータソースを設定 24 D_table.ItemsSource = dataTable.DefaultView; 25 26 // コンボボックス付きの列(使用項目)を作成 27 DataGridTemplateColumn columnC = new DataGridTemplateColumn(); 28 columnC.Header = "使用項目"; // 列のヘッダーを設定 29 30 // ドロップダウンメニューの編集用テンプレートを作成 31 FrameworkElementFactory factory = new FrameworkElementFactory(typeof(ComboBox)); 32 factory.SetValue(ComboBox.ItemsSourceProperty, Structure_List); 33 factory.SetValue(ComboBox.SelectedValueProperty, new Binding($"[{dataTable.Columns.Count}]")); 34 factory.SetValue(ComboBox.IsEditableProperty, true); 35 36 DataTemplate cellTemplate = new DataTemplate(); 37 cellTemplate.VisualTree = factory; 38 columnC.CellEditingTemplate = cellTemplate; 39 columnC.CellTemplate = cellTemplate; 40 41 // DataGridの表の2列目にコンボボックス付きの列(使用項目)を追加 42 D_table.Columns.Insert(1, columnC); 43 44 // 列インデックスを特定(列番号が不明なので特定する必要がある?) 45 int structureNameColumnIndex = -1; 46 47 for (int i = 0; i < D_table.Columns.Count; i++) 48 { 49 if (D_table.Columns[i].Header.ToString() == "使用項目") 50 { 51 structureNameColumnIndex = i; 52 break; 53 } 54 } 55 // グローバル変数に保存 56 GlobalVariables2.structureNameColumnIndex = structureNameColumnIndex; 57 58 } 59 60 61 62 private void button_Click(object sender, RoutedEventArgs e) 63 { 64 // グローバル変数から必要なものを受け取る 65 List<string> structureList = GlobalVariables2.structureList; 66 List<string> indexList = GlobalVariables2.indexList; 67 List<string> constraints1List = GlobalVariables2.constraints1List; 68 List<string> constraints2List = GlobalVariables2.constraints2List; 69 int structureNameColumnIndex = GlobalVariables2.structureNameColumnIndex; 70 71 72 //表中のコンボボックスの列で選択された項目をリストとして保存する(ここが上手くいかない) 73 List<string> selected_structure = new List<string>(); 74 selected_structure.Clear(); 75 foreach (DataRowView rowView in D_table.ItemsSource) 76 { 77 DataRow row = rowView.Row; 78 string selectedStructure = row[structureNameColumnIndex].ToString();// 使用項目の列から値を取得 79 selected_structure.Add(selectedStructure); // リストに追加 80 } 81 82 D_table.ItemsSource = null; 83 // 既存の列をクリア 84 D_table.Columns.Clear(); 85 86 // データソースとしてDataTableを使用 87 DataTable dataTable = new DataTable(); 88 dataTable.Columns.Add("評価項目", typeof(string)); 89 dataTable.Columns.Add("使用項目", typeof(string)); 90 dataTable.Columns.Add("評価指標", typeof(string)); 91 dataTable.Columns.Add("制約1", typeof(string)); 92 dataTable.Columns.Add("制約2", typeof(string)); 93 dataTable.Columns.Add("判定", typeof(string)); 94 95 // データを追加 96 for (int i = 0; i < structureList.Count; i++) 97 { 98 dataTable.Rows.Add(structureList[i], selected_structure[i], indexList[i], constraints1List[i], constraints2List[i]); 99 } 100 101 // DataGridにデータソースを設定 102 D_table.ItemsSource = dataTable.DefaultView; 103 104 105 106 }
試したこと
C#
1 D_table.Columns.Insert(1, columnC);
上記のようにコンボボックス付きの列を後から追加しているので列番号がおかしくなっていると考え、
以下のように列番号を探してみましたがこの列番号で指定してもダメでした。
コンボボックス付きの使用項目の列で選択された値を保存する方法が知りたいです。
C#
1 int structureNameColumnIndex = -1; 2 3 // 列インデックスを特定 4 for (int i = 0; i < D_table.Columns.Count; i++) 5 { 6 if (D_table.Columns[i].Header.ToString() == "使用項目") 7 { 8 structureNameColumnIndex = i; 9 break; 10 } 11 }
疑問点
他の疑問点として、発生する表はリストよりも1つ大きい大きさになります。
リストに10個格納されていれば11行の表が発生し、11行目は空白になります。
11行目がどうしても消えないのですが消す方法はありますでしょうか?

回答1件
あなたの回答
tips
プレビュー