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

回答編集履歴

4

Typo

2017/05/26 06:21

投稿

Tokeiya3
Tokeiya3

スコア260

answer CHANGED
@@ -172,5 +172,5 @@
172
172
 
173
173
  補足ですが、ComboBoxのListBoxに要素を追加したいなら、```ComboBox.Items.Add```メソッドを利用して追加し、TextBox部分に、表示したいのなら、```ComboBox.Text```プロパティに文字列を指定する必要があります。
174
174
 
175
- また蛇足ながら、初期の質問に対する回答に対する貴方のコメントは下の質問からずいぶん離れたイメージを個人的に持ちました。(現に質問からずいぶん質問そのものが変化していますよね?)
175
+ また蛇足ながら、初期の質問に対する回答に対する貴方のコメントは下の質問からずいぶん離れたイメージを個人的に持ちました。(現に元の質問からずいぶん質問そのものが変化していますよね?)
176
176
  なので、別に質問をすべきではなかったのかなと思います。

3

Typo

2017/05/26 06:21

投稿

Tokeiya3
Tokeiya3

スコア260

answer CHANGED
@@ -172,5 +172,5 @@
172
172
 
173
173
  補足ですが、ComboBoxのListBoxに要素を追加したいなら、```ComboBox.Items.Add```メソッドを利用して追加し、TextBox部分に、表示したいのなら、```ComboBox.Text```プロパティに文字列を指定する必要があります。
174
174
 
175
- また老婆心ながら、初期の質問に対する回答に対する貴方のコメントは下の質問からずいぶん離れたイメージを個人的に持ちました。(現に下質問からずいぶん質問そのものが変化していますよね?)
175
+ また蛇足ながら、初期の質問に対する回答に対する貴方のコメントは下の質問からずいぶん離れたイメージを個人的に持ちました。(現に下質問からずいぶん質問そのものが変化していますよね?)
176
176
  なので、別に質問をすべきではなかったのかなと思います。

2

コメント受けて追記

2017/05/26 06:20

投稿

Tokeiya3
Tokeiya3

スコア260

answer CHANGED
@@ -42,6 +42,135 @@
42
42
 
43
43
  ```
44
44
 
45
- ```_list```内の文字列が半角英数で有ればうまく行きますが、全角英数が入ったら破綻します。(半角・全角のCase-sensitivityは存在するので)
45
+ _list内の文字列が半角英数で有ればうまく行きますが、全角英数が入ったら破綻します。(半角・全角のCase-sensitivityは存在するので)
46
46
 
47
- また、TextBoxが空の場合は、すべてが引っかかりますのでその点もご注意の程。
47
+ また、TextBoxが空の場合は、すべてが引っかかりますのでその点もご注意の程。
48
+
49
+
50
+
51
+ ---
52
+
53
+
54
+
55
+ ココよりコメント受けての追記
56
+
57
+ foreach以降は
58
+
59
+ [LINQ](https://docs.microsoft.com/ja-jp/dotnet/articles/csharp/programming-guide/concepts/linq/introduction-to-linq-queries)を使って要素の抽出をしています。
60
+ その子細に関しては、ココではオフトピックとなりますので、リンク先をご参照ください。
61
+
62
+ 前方一致させる場合は、```string.IndexOf```メソッドを使い、結果が0で有れば、前方一致していることになるので、下記のようになります。
63
+
64
+ 以下のサンプルコードは
65
+
66
+ 0. ```button1```は最初のまま、含まれていればマッチ
67
+ 0. ```button2```はLINQを使って前方一致を実装
68
+ 0. ```button3```はLINQを使わずに実装
69
+
70
+ となります。
71
+
72
+ ```csharp
73
+
74
+ using System;
75
+ using System.Collections.Generic;
76
+ using System.Linq;
77
+ using System.Windows.Forms;
78
+
79
+ namespace WindowsFormsApp3
80
+ {
81
+ public partial class Form1 : Form
82
+ {
83
+ private readonly List<string> _list = new List<string>
84
+ {
85
+ "A",
86
+ "ABC",
87
+ "RAND",
88
+ "HELLO"
89
+ };
90
+
91
+ public Form1()
92
+ {
93
+ InitializeComponent();
94
+ }
95
+
96
+ /// <summary>
97
+ /// 含まれていればOK
98
+ /// </summary>
99
+ /// <param name="sender"></param>
100
+ /// <param name="e"></param>
101
+ private void button1_Click(object sender, EventArgs e)
102
+ {
103
+ comboBox1.Items.Clear();
104
+ comboBox1.Text = "";
105
+
106
+
107
+ foreach (var str in _list.Where(x => x.ToLower().Contains(textBox1.Text.ToLower())))
108
+ comboBox1.Items.Add(str);
109
+
110
+ if (comboBox1.Items.Count != 0) comboBox1.Text = (string) comboBox1.Items[0];
111
+ }
112
+
113
+ /// <summary>
114
+ /// 前方一致
115
+ /// </summary>
116
+ /// <param name="sender"></param>
117
+ /// <param name="e"></param>
118
+ private void button2_Click(object sender, EventArgs e)
119
+ {
120
+ //ComboBoxを初期化
121
+ comboBox2.Items.Clear();
122
+ comboBox2.Text = "";
123
+
124
+ //検索対象の文字列を取得
125
+ var matchStr = textBox1.Text.ToLower();
126
+
127
+ //LINQを利用したフィルタリング
128
+
129
+ var resultSeq = _list.Where(x => x.ToLower().IndexOf(matchStr) == 0);
130
+
131
+ //ComboBox.Itemsに結果を追加
132
+ foreach (var elem in resultSeq)
133
+ comboBox2.Items.Add(elem);
134
+
135
+ //抽出結果が0出なければ最初の要素をテキストボックスに設定
136
+ if (comboBox2.Items.Count != 0) comboBox2.Text = (string) comboBox2.Items[0];
137
+ }
138
+
139
+ /// <summary>
140
+ /// 前方一致をLINQつか言わないで書いてみた。
141
+ /// </summary>
142
+ /// <param name="sender"></param>
143
+ /// <param name="e"></param>
144
+ private void button3_Click(object sender, EventArgs e)
145
+ {
146
+ //ComboBoxを初期化
147
+ comboBox2.Items.Clear();
148
+ comboBox2.Text = "";
149
+
150
+ //検索対象の文字列を取得
151
+ var matchStr = textBox1.Text.ToLower();
152
+
153
+ //LINQを利用したフィルタリング
154
+ //ComboBox.Itemsに結果を追加
155
+ foreach (var elem in _list)
156
+ {
157
+ //小文字に正規化
158
+ var regularize = elem.ToLower();
159
+
160
+ //前方一致するか判定.マッチしたらコンボボックスに追加
161
+ if (regularize.IndexOf(matchStr) == 0) comboBox2.Items.Add(elem);
162
+ }
163
+
164
+ //抽出結果が0出なければ最初の要素をテキストボックスに設定
165
+ if (comboBox2.Items.Count != 0) comboBox2.Text = (string) comboBox2.Items[0];
166
+ }
167
+ }
168
+ }
169
+
170
+
171
+ ```
172
+
173
+ 補足ですが、ComboBoxのListBoxに要素を追加したいなら、```ComboBox.Items.Add```メソッドを利用して追加し、TextBox部分に、表示したいのなら、```ComboBox.Text```プロパティに文字列を指定する必要があります。
174
+
175
+ また老婆心ながら、初期の質問に対する回答に対する貴方のコメントは下の質問からずいぶん離れたイメージを個人的に持ちました。(現に下質問からずいぶん質問そのものが変化していますよね?)
176
+ なので、別に質問をすべきではなかったのかなと思います。

1

ゴミがサンプルに残っていたので除去

2017/05/26 06:20

投稿

Tokeiya3
Tokeiya3

スコア260

answer CHANGED
@@ -29,7 +29,6 @@
29
29
  comboBox1.Items.Clear();
30
30
  comboBox1.Text = "";
31
31
 
32
- var text = "hello";
33
32
 
34
33
  foreach (var str in _list.Where(x => x.ToLower().Contains(textBox1.Text.ToLower())))
35
34
  comboBox1.Items.Add(str);