質問編集履歴

2

修正

2019/01/29 12:45

投稿

inari_ken
inari_ken

スコア34

test CHANGED
File without changes
test CHANGED
@@ -173,3 +173,291 @@
173
173
 
174
174
 
175
175
  今後、列2で項目を選択した場合、列3以降は列1,2で選択した条件で抽出されるようにしたいと考えています。
176
+
177
+
178
+
179
+ ### ソースコード修正後(自分用)
180
+
181
+ ご回答を元にソースコードを修正し、意図通りに動作しました。
182
+
183
+
184
+
185
+ ```c#
186
+
187
+ public partial class MAIN : Form
188
+
189
+ {
190
+
191
+
192
+
193
+ // クラス内public
194
+
195
+ private List<string[]> F = new List<string[]>();
196
+
197
+ private List<ComboBox> Cmb = new List<ComboBox>(); //cmbboxを共通関数で扱いやすくするため、リストに入れて覚えておくためのもの
198
+
199
+
200
+
201
+ public MAIN()
202
+
203
+ {
204
+
205
+ InitializeComponent();
206
+
207
+
208
+
209
+
210
+
211
+ // テキストデータ読み込み
212
+
213
+ string file = @"C:\txt.csv";
214
+
215
+ StreamReader sr = new StreamReader(file, Encoding.GetEncoding("SHIFT_JIS"));
216
+
217
+ while (sr.EndOfStream == false)
218
+
219
+ {
220
+
221
+ string line = sr.ReadLine();
222
+
223
+ string[] linef = line.Split(',');
224
+
225
+ F.Add(linef);
226
+
227
+
228
+
229
+ }
230
+
231
+ sr.Close();
232
+
233
+
234
+
235
+ // 属性コンボボックスにグループ化した属性をAdd
236
+
237
+ AddCmb(cmbZOK1, 0); // cmbZOK1
238
+
239
+ AddCmb(cmbZOK2, 1); // cmbZOK2
240
+
241
+ AddCmb(cmbZOK3, 2); // cmbZOK3
242
+
243
+ AddCmb(cmbZOK4, 3); // cmbZOK4
244
+
245
+ AddCmb(cmbZOK5, 4); // cmbZOK5
246
+
247
+ AddCmb(cmbZOK6, 5); // cmbZOK6
248
+
249
+ AddCmb(cmbZOK7, 6); // cmbZOK7
250
+
251
+ AddCmb(cmbZOK8, 7); // cmbZOK8
252
+
253
+ AddCmb(cmbZOK9, 8); // cmbZOK9
254
+
255
+ AddCmb(cmbZOK10, 9); // cmbZOK10
256
+
257
+
258
+
259
+ void AddCmb(ComboBox ControlName, int arr)
260
+
261
+ {
262
+
263
+ var query = F.GroupBy(x => x[arr]);
264
+
265
+ foreach (var group in query)
266
+
267
+ {
268
+
269
+ ControlName.Items.Add(group.Key);
270
+
271
+ }
272
+
273
+ Cmb.Add(ControlName); //★ここでzok1から10をaddしておく。
274
+
275
+ }
276
+
277
+
278
+
279
+ }
280
+
281
+
282
+
283
+ private void Form1_Load(object sender, EventArgs e)
284
+
285
+ {
286
+
287
+
288
+
289
+
290
+
291
+ }
292
+
293
+
294
+
295
+ private void cmbZOK1_SelectedIndexChanged(object sender, EventArgs e)
296
+
297
+ {
298
+
299
+ Handler(cmbZOK1.Text, 0);
300
+
301
+ }
302
+
303
+
304
+
305
+ private void cmbZOK2_SelectedIndexChanged(object sender, EventArgs e)
306
+
307
+ {
308
+
309
+ Handler(cmbZOK2.Text, 1);
310
+
311
+ }
312
+
313
+
314
+
315
+ private void cmbZOK3_SelectedIndexChanged(object sender, EventArgs e)
316
+
317
+ {
318
+
319
+ Handler(cmbZOK3.Text, 2);
320
+
321
+ }
322
+
323
+
324
+
325
+ private void cmbZOK4_SelectedIndexChanged(object sender, EventArgs e)
326
+
327
+ {
328
+
329
+ Handler(cmbZOK4.Text, 3);
330
+
331
+ }
332
+
333
+
334
+
335
+ private void cmbZOK5_SelectedIndexChanged(object sender, EventArgs e)
336
+
337
+ {
338
+
339
+ Handler(cmbZOK5.Text, 4);
340
+
341
+ }
342
+
343
+
344
+
345
+ private void cmbZOK6_SelectedIndexChanged(object sender, EventArgs e)
346
+
347
+ {
348
+
349
+ Handler(cmbZOK6.Text, 5);
350
+
351
+ }
352
+
353
+
354
+
355
+ private void cmbZOK7_SelectedIndexChanged(object sender, EventArgs e)
356
+
357
+ {
358
+
359
+ Handler(cmbZOK7.Text, 6);
360
+
361
+ }
362
+
363
+
364
+
365
+ private void cmbZOK8_SelectedIndexChanged(object sender, EventArgs e)
366
+
367
+ {
368
+
369
+ Handler(cmbZOK8.Text, 7);
370
+
371
+ }
372
+
373
+
374
+
375
+ private void cmbZOK9_SelectedIndexChanged(object sender, EventArgs e)
376
+
377
+ {
378
+
379
+ Handler(cmbZOK9.Text, 8);
380
+
381
+ }
382
+
383
+
384
+
385
+ private void cmbZOK10_SelectedIndexChanged(object sender, EventArgs e)
386
+
387
+ {
388
+
389
+ Handler(cmbZOK10.Text, 9);
390
+
391
+ }
392
+
393
+
394
+
395
+ // Fから特定列(縦方向)を抜き出す補助関数
396
+
397
+ static IEnumerable<string> PickColumn(IEnumerable<string[]> table, int columnNumber) => table.Select(line => line[columnNumber]);
398
+
399
+
400
+
401
+ // Fから、idx列目までの値を基準に、その手前までを絞る補助関数
402
+
403
+ static IEnumerable<string[]> FilterMulti(IEnumerable<string[]> table, List<ComboBox> cmbboxes, int selectedCmbIdx) => table
404
+
405
+ .Where(line => Enumerable.Range(0, selectedCmbIdx + 1)
406
+
407
+ .All(i => cmbboxes[i].Text == "" || line[i] == cmbboxes.ElementAt(i).Text) );
408
+
409
+
410
+
411
+ //cmb内容をリセット・グループ化するための補助関数
412
+
413
+ static void ResetItems(ComboBox cmb, IEnumerable<string> items) //★objectだとgroupbyが使えないため、stringに変更
414
+
415
+ {
416
+
417
+ cmb.Items.Clear();
418
+
419
+ var query = items.GroupBy(x => x);
420
+
421
+ foreach(var group in query)
422
+
423
+ {
424
+
425
+ cmb.Items.Add(group.Key);
426
+
427
+ }
428
+
429
+
430
+
431
+ }
432
+
433
+
434
+
435
+ //CmbZOK1_selectedIndexChangeとかで、このハンドラを呼び、そのとき、Zok1なら0,Zok8なら7という自身のcmbにおけるインデクスと、選択された値を渡してください。
436
+
437
+ void Handler(string selectedText, int selectedCmbIdx)
438
+
439
+ {
440
+
441
+ var filteredF = F.Where(x => x[selectedCmbIdx] == selectedText).ToArray();
442
+
443
+ var filteredMultiF = FilterMulti(filteredF, Cmb, selectedCmbIdx);
444
+
445
+
446
+
447
+ for (var i = selectedCmbIdx + 1; i < 10; i++)
448
+
449
+ {
450
+
451
+ ResetItems(Cmb[i], PickColumn(filteredMultiF, i));
452
+
453
+ Cmb[i].Text = string.Empty;
454
+
455
+ }
456
+
457
+ }
458
+
459
+
460
+
461
+ }
462
+
463
+ ```

1

追記

2019/01/29 12:45

投稿

inari_ken
inari_ken

スコア34

test CHANGED
File without changes
test CHANGED
@@ -168,7 +168,7 @@
168
168
 
169
169
 
170
170
 
171
- 列1(cmbZOK1)で”エチオピア”と選択した場合、列"2"(cmbZOK2)はグジ、シダモが抽出されるイメージです。
171
+ 列1(cmbZOK1)で”エチオピア”と選択した場合、列2(cmbZOK2)はグジ、シダモが抽出され、列3にはナチュラル、ウォッシュトが抽出されるイメージです。
172
172
 
173
173
 
174
174