4


1

winformsのテキストボックスのオートコンプリートドロップダウンボックスのハンドルの取得

テキストボックスの[オートコンプリート]ドロップダウンボックスの幅を調整したかった。 そのテキストボックスの幅を調整したくありませんが、オートコンプリートのドロップダウンのみです。 textboxで提供されるプロパティを使用して、オートコンプリートドロップダウンの幅を広げることができないことを知っています。

したがって、そのオートコンプリートボックスのハンドルを取得して、テキストボックスの幅を変更せずにそのドロップダウンリストの幅を増やす方法があるかどうかを知りたいですか?

これが不可能な場合は、オートコンプリートを使用してカスタムテキストボックスを作成します。この場合、Microsoftが提供する既存のオートコンプリート機能を使用するにはどうすればよいですか? それをする方法はありますか。 これに利用できるライブラリはありますか?

2 Answer


5


Microsoftのhttp://msdn.microsoft.com/en-us/library/bb776884(VS.85).aspx[autocomplete]の実装を使用できるとは思わない。ドロップダウンの幅を調整するオプションはありません。

入力の邪魔にならないようにバックグラウンドスレッドを作成し、コンボボックスまたはテキストボックスのテキスト変更イベントをフックして候補リストを更新します(ドロップダウンについて言及しているため、自動提案モードを想定しています)。 コンボボックスがある場合は、おそらくhttp://msdn.microsoft.com/en-us/magazine/cc301412.aspx [その場でコンボボックスアイテムを追加/削除]できます。 ただし、ドロップダウンリストとテキストボックスアイテムの場合は、http://www.codeproject.com/KB/cs/AutoCompleteTextBox.aspx [ポップアップウィンドウが必要]

ポップアップを表示するのは簡単ですが、テキストボックスが画面の端に近づいたときに画面から消えないように、固定位置を使用する必要はありません。 そして、フォーカスロジックは少し複雑です。 ユーザーが矢印キーを押して選択を行わない限り、テキストボックスに焦点を合わせる必要があります。

そのため、フォーカスがテキストボックスにあるとき:矢印キーはフォーカスをポップアップに移動し、他のキーはダイアログ自体で処理されない場合、マウスがポップアップ上にあるときの削除キーを除き、テキストボックスに移動します。 ポップアップにフォーカスがある場合:矢印キーは、兄弟候補項目またはテキストボックスにフォーカスを移動します。他のキーは、ダイアログ自体では処理されない場合、削除キーを除き、テキストボックスに移動します

マウスクリック:ポップアップまたはポップアップの外側のポップアップを閉じます。 ポップアップ内の候補アイテムがクリックされた場合にテキストボックスの値を更新する

フォーカス/スレッド化を正しく行うには多くの労力が必要です。 フォームスペースに余裕がある場合は、代わりに、Visual Studioヘルプビューアーのインデックスペインのように、フォームに固定幅のリストボックスを追加するだけです。


3


多くのブログ記事やさまざまな記事を読んだ後、私は自分の問題の解決策を望みどおりに得ることはほとんど不可能であるというコンセンサスに達しました。 そこで、カスタムソリューションを考案するか、Sheng Jiangが私自身のオートコンプリートオブジェクトを実装する必要があると言ったように決定しました。

オートコンプリートカスタムソースを追加する際に、オートコンプリート文字列リストの最大文字列ごとにテキストボックスの幅を大きくすることで、要件に合ったソリューションを考え出しました。 先ほど言ったように、フォームのサイズ制限のためにテキストボックスの幅を大きくすることはできないので、このテキストボックスをパネルに保持し、その内部のテキストボックスのサイズを大きくすることにしました。 私の問題を解決したので、パネルはテキストボックスとともに成長しません。

これは完璧な解決策ではないことは知っていますが、私の要件には合います。