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

回答編集履歴

2

ついか

2019/01/29 04:33

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -46,4 +46,10 @@
46
46
  Cmb[j].Text = string.Empty;
47
47
  }
48
48
  }
49
+ ```
50
+ ---
51
+ さらに追加
52
+ Fから、idx列目までの値を基準に、その手前までを絞る方法。ただこの場合、手前に空文字があるとうまく絞れないので、その辺手当が必要
53
+ ```csharp
54
+ static IEnumerable<string[]> FilterMulti(IEnumerable<string[]> table, IEnumerable<ComboBox> cmbboxes, int selectedCmbIdx) => table.Where(line => Enumerable.Range(0, selectedCmbIdx + 1).All(i => line[i] == cmbboxes.ElementAt(i).Text));
49
55
  ```

1

追加

2019/01/29 04:33

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -9,4 +9,41 @@
9
9
  cmbZOK2.Items.Add(group.Key.y);
10
10
  }
11
11
  }
12
+ ```
13
+
14
+ ---
15
+ では、5が選ばれたときに、1から4を""にし、6から10が5のみに基づいて絞られるような集約した例をご提示します
16
+ ```csharp
17
+ public Form1()
18
+ {
19
+ InitializeComponent();
20
+ Cmb.Add(new ComboBox());//ここでzok1から10をaddしておきます。
21
+ Cmb.Add(new ComboBox());
22
+ }
23
+ private List<string[]> F = new List<string[]>(); //Fはこういう型だと想定してます
24
+ private List<ComboBox> Cmb = new List<ComboBox>();//cmbboxを共通関数で扱いやすくするため、リストに入れて覚えておくためのもの
25
+
26
+ //Fから特定列(縦方向)を抜き出す補助関数
27
+ static IEnumerable<string> PickColumn(IEnumerable<string[]> table, int columnNumber) => table.Select(line => line[columnNumber]);
28
+
29
+ //addcmbみたいな、リセットするための補助関数(たしかaddrangeだと追加だけだったように思う)
30
+ static void ResetItems(ComboBox cmb, IEnumerable<object> items)
31
+ {
32
+ cmb.Items.Clear();
33
+ cmb.Items.AddRange(items.ToArray());
34
+ }
35
+
36
+ //CmbZOK1_selectedIndexChangeとかで、このハンドラを呼び、そのとき、Zok1なら0,Zok8なら7という自身のcmbにおけるインデクスと、選択された値を渡してください。
37
+ void Handler(string selectedText, int selectedCmbIdx)
38
+ {
39
+ var filteredF = F.Where(x => x[selectedCmbIdx] == selectedText).ToArray();
40
+ for (var i = selectedCmbIdx + 1; i < 10; i++)
41
+ {
42
+ ResetItems(Cmb[i], PickColumn(filteredF, i));
43
+ }
44
+ for (var j = 0; j < selectedCmbIdx; j++)
45
+ {
46
+ Cmb[j].Text = string.Empty;
47
+ }
48
+ }
12
49
  ```