回答編集履歴

2

ついか

2019/01/29 04:33

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -95,3 +95,15 @@
95
95
  }
96
96
 
97
97
  ```
98
+
99
+ ---
100
+
101
+ さらに追加
102
+
103
+ Fから、idx列目までの値を基準に、その手前までを絞る方法。ただこの場合、手前に空文字があるとうまく絞れないので、その辺手当が必要
104
+
105
+ ```csharp
106
+
107
+ 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));
108
+
109
+ ```

1

追加

2019/01/29 04:33

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -21,3 +21,77 @@
21
21
  }
22
22
 
23
23
  ```
24
+
25
+
26
+
27
+ ---
28
+
29
+ では、5が選ばれたときに、1から4を""にし、6から10が5のみに基づいて絞られるような集約した例をご提示します
30
+
31
+ ```csharp
32
+
33
+ public Form1()
34
+
35
+ {
36
+
37
+ InitializeComponent();
38
+
39
+ Cmb.Add(new ComboBox());//ここでzok1から10をaddしておきます。
40
+
41
+ Cmb.Add(new ComboBox());
42
+
43
+ }
44
+
45
+ private List<string[]> F = new List<string[]>(); //Fはこういう型だと想定してます
46
+
47
+ private List<ComboBox> Cmb = new List<ComboBox>();//cmbboxを共通関数で扱いやすくするため、リストに入れて覚えておくためのもの
48
+
49
+
50
+
51
+ //Fから特定列(縦方向)を抜き出す補助関数
52
+
53
+ static IEnumerable<string> PickColumn(IEnumerable<string[]> table, int columnNumber) => table.Select(line => line[columnNumber]);
54
+
55
+
56
+
57
+ //addcmbみたいな、リセットするための補助関数(たしかaddrangeだと追加だけだったように思う)
58
+
59
+ static void ResetItems(ComboBox cmb, IEnumerable<object> items)
60
+
61
+ {
62
+
63
+ cmb.Items.Clear();
64
+
65
+ cmb.Items.AddRange(items.ToArray());
66
+
67
+ }
68
+
69
+
70
+
71
+ //CmbZOK1_selectedIndexChangeとかで、このハンドラを呼び、そのとき、Zok1なら0,Zok8なら7という自身のcmbにおけるインデクスと、選択された値を渡してください。
72
+
73
+ void Handler(string selectedText, int selectedCmbIdx)
74
+
75
+ {
76
+
77
+ var filteredF = F.Where(x => x[selectedCmbIdx] == selectedText).ToArray();
78
+
79
+ for (var i = selectedCmbIdx + 1; i < 10; i++)
80
+
81
+ {
82
+
83
+ ResetItems(Cmb[i], PickColumn(filteredF, i));
84
+
85
+ }
86
+
87
+ for (var j = 0; j < selectedCmbIdx; j++)
88
+
89
+ {
90
+
91
+ Cmb[j].Text = string.Empty;
92
+
93
+ }
94
+
95
+ }
96
+
97
+ ```