

TextBoxまたはComboBoxにおいて

[code]

    textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
    textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
    
[/code]

として、`textBox1.AutoCompleteCustomSource`に住所録の名前が入っているとします。  
名前の文字を数文字入れるとサジェストされますが、その時の候補が出ているリストボックスの名前の横に、例えば電話番号や住所などを併記したいのです。  
その併記情報をオーナードローで行えないか？と思うのですが、当方環境ではVisual Studio
2008付属のSpy++(32bit版/64bit版)がフッキングに失敗してWindowsメッセージを上手く取れないため分かりません(取れたところで実装方法が分かるかも怪しいのですが)。

別にオーナードローでなくても、見た目的に同じような事が出来れば構いません。  
要は、こんな風にしたいという事です(画像は編集で作ってます)。

![オートコンプリートの例](https://i.stack.imgur.com/xYOws.jpg)

このとき、赤枠で表示されているところは
AutoCompleteCustomSourceコレクションに対応する別のコレクションでもいいですし、そもそもオートコンプリートを用いずに見た目的に同じなら、文字が入力されたときにテキストボックス下にリストボックス(リストビューの方がいい？)が表示されるでも構わないです。

これって結構難しいでしょうか？


CC BY-SA 3.0
2015-02-18T15:56:38.647
6708
2015-02-19T15:35:10.043
7966
question
c# .net
C# TextBoxのオートコンプリートリストにオーナードロー等でリストの横に付随情報を書くことは出来るでしょうか？


直接、オートコンプリートの右側に情報を追加する。という機能は無いかと思います。

フォントと文字幅をうまく調整して手動でやる方法がまずあります。  
当然処理が複雑になりますし、面倒ですよね。  
オートコンプリートの幅が変更した時も多分追従出来ないでしょうし。

次にオートコンプリートを使うのではなく、wpf+自力でリストビューを使う方法。  
オートコンプリートで という話から外れてしまいますし、これも処理が面倒ですよね。  
オートコンプリートを表示する→マウスホイールでスクロール→オートコンプリートエリアが置いてけぼり とかよくあります。

wpfを簡単に説明すると、リストビューで表示する1項目を自分で定義する手段と言えます。  
通常リストビューの1アイテムはテキストと、後はアイコンくらい？しか表示出来ませんでしたが、wpfのデータバインドという機能を使うと自由にレイアウトを組む事が出来ます。

直接やる方法は残念ながら無いかと思いますが、こういう手段もありますよ という話でした。


CC BY-SA 3.0
2015-02-19T01:20:43.663
6718
2015-02-19T01:20:43.663
805
6708
answer


技術的にオーナードローが実現できるかという点について調べてみましたが、Spy++にはAutoCompleteを設定したフォームを表示すると`Auto-
Suggest
Dropdown`というクラスの最上位ウィンドウが`TextBox`の数だけ作成されていました。その配下の`SysListView32`のhWndを取得して`SetWindowsHookEx`で表示のタイミングを把握し、`Graphics.FromHwnd`で得たコンテキストに描きこめば原理的にはオーナードロー可能なはずです。ただ`WM_PAINT`のタイミングではテキストが書かれていなかったのでどのメッセージが適切かは分かりません。


CC BY-SA 3.0
2015-02-19T15:35:10.043
6791
2015-02-19T15:35:10.043
5750
6708
answer