質問するログイン新規登録

質問編集履歴

2

修正

2019/01/29 12:45

投稿

inari_ken
inari_ken

スコア34

title CHANGED
File without changes
body CHANGED
@@ -85,4 +85,148 @@
85
85
 
86
86
  列1(cmbZOK1)で”エチオピア”と選択した場合、列2(cmbZOK2)はグジ、シダモが抽出され、列3にはナチュラル、ウォッシュトが抽出されるイメージです。
87
87
 
88
- 今後、列2で項目を選択した場合、列3以降は列1,2で選択した条件で抽出されるようにしたいと考えています。
88
+ 今後、列2で項目を選択した場合、列3以降は列1,2で選択した条件で抽出されるようにしたいと考えています。
89
+
90
+ ### ソースコード修正後(自分用)
91
+ ご回答を元にソースコードを修正し、意図通りに動作しました。
92
+
93
+ ```c#
94
+ public partial class MAIN : Form
95
+ {
96
+
97
+ // クラス内public
98
+ private List<string[]> F = new List<string[]>();
99
+ private List<ComboBox> Cmb = new List<ComboBox>(); //cmbboxを共通関数で扱いやすくするため、リストに入れて覚えておくためのもの
100
+
101
+ public MAIN()
102
+ {
103
+ InitializeComponent();
104
+
105
+
106
+ // テキストデータ読み込み
107
+ string file = @"C:\txt.csv";
108
+ StreamReader sr = new StreamReader(file, Encoding.GetEncoding("SHIFT_JIS"));
109
+ while (sr.EndOfStream == false)
110
+ {
111
+ string line = sr.ReadLine();
112
+ string[] linef = line.Split(',');
113
+ F.Add(linef);
114
+
115
+ }
116
+ sr.Close();
117
+
118
+ // 属性コンボボックスにグループ化した属性をAdd
119
+ AddCmb(cmbZOK1, 0); // cmbZOK1
120
+ AddCmb(cmbZOK2, 1); // cmbZOK2
121
+ AddCmb(cmbZOK3, 2); // cmbZOK3
122
+ AddCmb(cmbZOK4, 3); // cmbZOK4
123
+ AddCmb(cmbZOK5, 4); // cmbZOK5
124
+ AddCmb(cmbZOK6, 5); // cmbZOK6
125
+ AddCmb(cmbZOK7, 6); // cmbZOK7
126
+ AddCmb(cmbZOK8, 7); // cmbZOK8
127
+ AddCmb(cmbZOK9, 8); // cmbZOK9
128
+ AddCmb(cmbZOK10, 9); // cmbZOK10
129
+
130
+ void AddCmb(ComboBox ControlName, int arr)
131
+ {
132
+ var query = F.GroupBy(x => x[arr]);
133
+ foreach (var group in query)
134
+ {
135
+ ControlName.Items.Add(group.Key);
136
+ }
137
+ Cmb.Add(ControlName); //★ここでzok1から10をaddしておく。
138
+ }
139
+
140
+ }
141
+
142
+ private void Form1_Load(object sender, EventArgs e)
143
+ {
144
+
145
+
146
+ }
147
+
148
+ private void cmbZOK1_SelectedIndexChanged(object sender, EventArgs e)
149
+ {
150
+ Handler(cmbZOK1.Text, 0);
151
+ }
152
+
153
+ private void cmbZOK2_SelectedIndexChanged(object sender, EventArgs e)
154
+ {
155
+ Handler(cmbZOK2.Text, 1);
156
+ }
157
+
158
+ private void cmbZOK3_SelectedIndexChanged(object sender, EventArgs e)
159
+ {
160
+ Handler(cmbZOK3.Text, 2);
161
+ }
162
+
163
+ private void cmbZOK4_SelectedIndexChanged(object sender, EventArgs e)
164
+ {
165
+ Handler(cmbZOK4.Text, 3);
166
+ }
167
+
168
+ private void cmbZOK5_SelectedIndexChanged(object sender, EventArgs e)
169
+ {
170
+ Handler(cmbZOK5.Text, 4);
171
+ }
172
+
173
+ private void cmbZOK6_SelectedIndexChanged(object sender, EventArgs e)
174
+ {
175
+ Handler(cmbZOK6.Text, 5);
176
+ }
177
+
178
+ private void cmbZOK7_SelectedIndexChanged(object sender, EventArgs e)
179
+ {
180
+ Handler(cmbZOK7.Text, 6);
181
+ }
182
+
183
+ private void cmbZOK8_SelectedIndexChanged(object sender, EventArgs e)
184
+ {
185
+ Handler(cmbZOK8.Text, 7);
186
+ }
187
+
188
+ private void cmbZOK9_SelectedIndexChanged(object sender, EventArgs e)
189
+ {
190
+ Handler(cmbZOK9.Text, 8);
191
+ }
192
+
193
+ private void cmbZOK10_SelectedIndexChanged(object sender, EventArgs e)
194
+ {
195
+ Handler(cmbZOK10.Text, 9);
196
+ }
197
+
198
+ // Fから特定列(縦方向)を抜き出す補助関数
199
+ static IEnumerable<string> PickColumn(IEnumerable<string[]> table, int columnNumber) => table.Select(line => line[columnNumber]);
200
+
201
+ // Fから、idx列目までの値を基準に、その手前までを絞る補助関数
202
+ static IEnumerable<string[]> FilterMulti(IEnumerable<string[]> table, List<ComboBox> cmbboxes, int selectedCmbIdx) => table
203
+ .Where(line => Enumerable.Range(0, selectedCmbIdx + 1)
204
+ .All(i => cmbboxes[i].Text == "" || line[i] == cmbboxes.ElementAt(i).Text) );
205
+
206
+ //cmb内容をリセット・グループ化するための補助関数
207
+ static void ResetItems(ComboBox cmb, IEnumerable<string> items) //★objectだとgroupbyが使えないため、stringに変更
208
+ {
209
+ cmb.Items.Clear();
210
+ var query = items.GroupBy(x => x);
211
+ foreach(var group in query)
212
+ {
213
+ cmb.Items.Add(group.Key);
214
+ }
215
+
216
+ }
217
+
218
+ //CmbZOK1_selectedIndexChangeとかで、このハンドラを呼び、そのとき、Zok1なら0,Zok8なら7という自身のcmbにおけるインデクスと、選択された値を渡してください。
219
+ void Handler(string selectedText, int selectedCmbIdx)
220
+ {
221
+ var filteredF = F.Where(x => x[selectedCmbIdx] == selectedText).ToArray();
222
+ var filteredMultiF = FilterMulti(filteredF, Cmb, selectedCmbIdx);
223
+
224
+ for (var i = selectedCmbIdx + 1; i < 10; i++)
225
+ {
226
+ ResetItems(Cmb[i], PickColumn(filteredMultiF, i));
227
+ Cmb[i].Text = string.Empty;
228
+ }
229
+ }
230
+
231
+ }
232
+ ```

1

追記

2019/01/29 12:45

投稿

inari_ken
inari_ken

スコア34

title CHANGED
File without changes
body CHANGED
@@ -83,6 +83,6 @@
83
83
  |コロンビア|ナリーニョ|ウォッシュト|
84
84
 
85
85
 
86
- 列1(cmbZOK1)で”エチオピア”と選択した場合、列"2"(cmbZOK2)はグジ、シダモが抽出されるイメージです。
86
+ 列1(cmbZOK1)で”エチオピア”と選択した場合、列2(cmbZOK2)はグジ、シダモが抽出され、列3にはナチュラル、ウォッシュトが抽出されるイメージです。
87
87
 
88
88
  今後、列2で項目を選択した場合、列3以降は列1,2で選択した条件で抽出されるようにしたいと考えています。