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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

VB.NET

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

Q&A

解決済

1回答

5010閲覧

C# ListBoxのデータを、2文字目以降もキーボードで選択できるようにしたい

tamogi

総合スコア72

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

VB.NET

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

0グッド

1クリップ

投稿2017/01/15 05:25

###前提・実現したいこと
WindowsフォームアプリケーションのListBoxに以下のようなデータがある状態で、
キーボードで「123」と入力した時に「123 いいい」のデータを選択したいです。
ListBox Items

###発生している問題・エラーメッセージ

「123」と入力すると最初の一文字でしか選択ができず、「111」「222」「333」の順でデータ
選択されてしまう。

###該当のソースコード
コード自体はありません。デザイナでフォームにListBoxを置き、
プロパティからデータを追加しました。

###試したこと
MSDNのページから、該当するプロパティ等が無いかを探しましたが、見当たりませんでした。

Key関連のイベントを駆使して、コードで実装しないと実現不可能なのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

標準の機能としてはありません。
おそらく挙動が曖昧になるためだと思われます。

どういうことかというと、たとえば「123 aa」と「234 bb」の項目があって、
1, 2, 3 の順でキー押下した場合に、押下するスピードによって

  • 「123」の入力とみなされ、「123 aa」が選択される
  • 「1」と「23」の入力とみなされ、「123 aa」が選択された後に「234 bb」が選択される

というように動きが変わってしまって使いづらいのでは?ということです。

それを承知の上で実現したいのであれば、おっしゃるとおり
Keyイベントから自前で実装することになるかと思います。
一応以下に簡易に作ってみたサンプルを載せておきますが、
個人的な意見としては、キーで選択したいなら、別にTextBoxを配置して
そこの入力文字から表示項目をインクリメンタルに絞り込む、とかのほうが
使いやすいのでは?という気もします。

C#

1public class KeySelectionListBox : ListBox 2{ 3 //キーの連続入力を待機する時間(ミリ秒) 4 const int KeyPressContinueTimeout_ms = 200; 5 6 //入力された文字をためておく 7 readonly List<char> pressedChars = new List<char>(); 8 9 //入力が継続している場合に選択処理をキャンセルするためのもの 10 CancellationTokenSource preTaskTokenSource; 11 12 protected override void OnKeyPress(KeyPressEventArgs e) 13 { 14 //もともとの先頭文字選択の動きを無効化 15 e.Handled = true; 16 17 lock (pressedChars) 18 { 19 pressedChars.Add(e.KeyChar); 20 } 21 22 //入力が継続しているので、確定待機中であればキャンセルしておく 23 if (preTaskTokenSource != null) 24 { 25 preTaskTokenSource.Cancel(); 26 preTaskTokenSource = null; 27 } 28 29 var tokenSource = new CancellationTokenSource(); 30 preTaskTokenSource = tokenSource; 31 32 Task.Delay(KeyPressContinueTimeout_ms, tokenSource.Token).ContinueWith(t => 33 { 34 if (t.IsCanceled) return; 35 36 string input; 37 38 lock (pressedChars) 39 { 40 input = new string(pressedChars.ToArray()); 41 pressedChars.Clear(); 42 } 43 44 //先頭から一致する項目があれば選択 45 var item = this.Items 46 .Cast<object>() 47 .FirstOrDefault(i => i.ToString().StartsWith(input)); 48 if (item != null) this.SelectedItem = item; 49 50 }, TaskScheduler.FromCurrentSynchronizationContext()); 51 52 } 53}

投稿2017/01/15 06:45

oika

総合スコア425

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

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

tamogi

2017/01/16 13:43

ソース付きの回答ありがとうございました。 大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問