質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

7437閲覧

部分一致検索が可能なコンボボックス作成について

Taffy

総合スコア33

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/09/30 06:36

部分一致検索が可能なコンボボックスを作成しようとしています。

開発環境は Visual Studio Express 2017 for Windows Desktop
言語はC#、.NET Framework 4.7.2を使用しています。

こちらのWebサイトを参考とし、
下記のようなテストプログラムを作成しました。

C#

1 DataTable _dt = new DataTable(); 2 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void Form1_Load(object sender, EventArgs e) 9 { 10 //サンプルデータの処理 11 DataColumn dc = new DataColumn(); 12 dc.ColumnName = "Text"; 13 dc.DataType = typeof(string); 14 this._dt.Columns.Add(dc); 15 DataRow dr = this._dt.NewRow(); 16 dr[0] = "相田"; 17 this._dt.Rows.Add(dr); 18 dr = this._dt.NewRow(); 19 dr[0] = "相川"; 20 this._dt.Rows.Add(dr); 21 dr = this._dt.NewRow(); 22 dr[0] = "井上"; 23 this._dt.Rows.Add(dr); 24 dr = this._dt.NewRow(); 25 dr[0] = "井川"; 26 this._dt.Rows.Add(dr); 27 dr = this._dt.NewRow(); 28 dr[0] = "井本"; 29 this._dt.Rows.Add(dr); 30 dr = this._dt.NewRow(); 31 dr[0] = "宇野"; 32 this._dt.Rows.Add(dr); 33 dr = this._dt.NewRow(); 34 dr[0] = "宇田"; 35 this._dt.Rows.Add(dr); 36 dr = this._dt.NewRow(); 37 dr[0] = "井田"; 38 this._dt.Rows.Add(dr); 39 40 DataView dv = this._dt.DefaultView; 41 this.comboBox1.DataSource = dv; 42 this.comboBox1.DisplayMember = "Text"; 43 this.comboBox1.ValueMember = "Text"; 44 } 45 46 private void comboBox1_KeyDown(object sender, KeyEventArgs e) 47 { 48 DataView dv = this._dt.DefaultView; 49 dv.RowFilter = "Text LIKE '*" + this.comboBox1.Text + "*'"; 50 }

コンボボックスのKeyDownイベントで絞り込みが行われますが
絞り込み実行後、BackSpaceキーで文字を消した場合(空白にした場合)
選択肢が絞り込み後のものとなっておりリセットされないという問題を抱えています。

※ リセットされない・・・絞り込みを行う前の選択肢の状態に戻らない の意味

イメージ説明

以下のイベントを追加しましたが、状況は改善していません。

C#

1 private void comboBox1_TextChanged(object sender, EventArgs e) 2 { 3 ComboBox cmb = (ComboBox)sender; 4 // 入力文字なければ 5 if (string.IsNullOrEmpty(cmb.Text) == true) 6 { 7 // 選択肢をリセット 8 cmb.DataSource = _dt; 9 } 10 }

実現方法についてご教示いただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

keyDownイベントだと、BackSpaceで削除された後の内容がイベントで受け取れず、フィルターへの反映がなされません。
keyUpイベントを使用するのがよいのではないでしょうか?

投稿2020/09/30 07:49

kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taffy

2020/10/01 01:17

教えていただきありがとうございます。 KeyDownイベントでは、BackSpaceで全削除した後のコンボボックスの値が空白にならないことが気になっていました。 KeyUpイベントを使用することで対応できるようになりました。
退会済みユーザー

退会済みユーザー

2020/10/01 02:35

こちらをベストアンサーにしたということは、RowFilter に空白を代入するというやり方は質問する前にすでに分かっていたが、質問者さんのコードでは this.comboBox1.Text が空白にならなかったのが問題だったということ? そうであれば最初の質問にそのことを書いておくべきです。 そうじゃなくて、そもそもの課題を解決するための RowFilter に空白を代入するというやり方を知らなかったのでは? そうであれば、ベストアンサーの付け方が間違ていると思うのですが。
kenshirou

2020/10/02 00:58

この問題の直接の原因はKeyDownを使用していたことなので、KeyUpに変更したことが大きな解決ポイントであることは、誠に僭越ながら、揺るぎようがないです。 #私は業者さんではないので、別にBAなんて要らないけれどね。 質問者の疑問が解消されればそれでいい。
退会済みユーザー

退会済みユーザー

2020/10/02 09:09

> この問題の直接の原因はKeyDownを使用していたことなので、KeyUpに変更したことが大きな解決ポイントであることは、誠に僭越ながら、揺るぎようがないです。 どうでしょう? RowFilter に空白を代入するというやり方は質問する前にすでに分かっていたが、質問者さんのコードでは this.comboBox1.Text が空白にならなかったのが問題だったということであれば、それは解決策の一つではあるとは思います。 でも、もしそうであっても、keyUp に変更するとかではなくて、ComboBox に「全て」というような項目を追加して、SelectedIndexChanged イベントなどでチェックして「全て」が選ばれていたら空白を代入するという提案にした方がユーザーフレンドリーで良さそうです。
kenshirou

2020/10/05 01:37

> 質問者さんのコードでは this.comboBox1.Text が空白にならなかったのが問題だった 正にその通りで、恐らくこれは質問者と私との間では暗黙の了解であったと思いますが、「KeyDownの時点ではテキスト内容が変わらない」ことを私は明示すべきだったと反省します。 第三者にしてみれば、私の回答内容では上記事実を理解できないかも知れませんね。 ところで、コンボボックスのテキストが空の場合はフィルター解除「dv.RowFilter = "";」すべきだと思いますが、質問者のロジックをそのまま使えば、コンボボックスのテキストが空の場合のフィルターは「dv.RowFilter = "Text LIKE '**'";」となり、結局全件対象となります。 データ数が多い場合はこれを使うべきではない(フィルター解除すべき)と思いますが、この程度のデータ件数なら、"Text LIKE~"のパターンを使い続けてもいいですけどね。 なお、ComboBox に空文字の行を用意するというのは大賛成です。
guest

0

ComboBox が空白の時は RowFilter に空白を設定するようにしてはいかがですか? 以下のような感じ。

イメージ説明

上の画像のコードは以下の記事の一部ですが、ちゃんと初期表示(全選択)に戻ることは確認しています。

CSV ファイルを DataGridView に表示
http://surferonwww.info/BlogEngine/post/2020/09/11/show-date-in-csv-file-on-datagridview.aspx

投稿2020/09/30 07:19

編集2020/09/30 07:22
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taffy

2020/10/01 01:16

教えていただきありがとうございます。 入力文字が空白であれば、フィルターを空白にするように対応しました。 private void comboBox1_KeyUp(object sender, KeyEventArgs e) { //コンボボックスのデータの更新の為 DataView dv = this._dt.DefaultView; ComboBox cmb = (ComboBox)sender; // 入力文字なければ if (string.IsNullOrEmpty(cmb.Text) == true) { // 元に戻す dv.RowFilter = ""; cmb.SelectedIndex = -1; } else { string strVal = cmb.Text; // コンボボックスに入力された文字列でフィルター dv.RowFilter = "Text LIKE '*" + this.comboBox1.Text + "*'"; // 入力した名前を表示 cmb.Text = strVal; } }
退会済みユーザー

退会済みユーザー

2020/10/01 01:27

解決したのであればクローズしてください。解決してなくて疑問などがあればそれを書いてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問