データベースからの行を含むデータ グリッドに関連する詳細表示の一部である ComboBox があります。ComboBox へのバインディングは存在しません。手動で行っています。ComboBox では、選択肢のドロップダウンを提供しながら、テキスト フィールドのように手動で入力できます。
私の問題は、フィールドに手動でテキストを入力し、ドロップダウンをクリックすると、ComboBox が明らかに一致を探したいということです。また、検索は単純なようで、 にKG
一致しKG/Day
ます。これを回避し、完全一致を強制する必要があります。
しかしさらに、プロセス全体を自分で管理できるようにする必要があると思います。問題をさらに複雑にするために、ドロップダウン項目は実際にはKG/Day - kilograms/day
. ただし、データがフェッチされるデータベース フィールドには、ハイフンの前の部分しか格納されていないため、KG/Day
.
したがって、次の 2 つのことを実行できるように、ドロップダウン アクションをインターセプトする必要があります。
1) 独自の検索を実行して、アドホック テキストがあるかどうか、または「実際の」一致があるかどうかを確認します。もともとドロップダウンから選択されていたのと同じです。言い換えれば、私が持っているKG/Day
だけでなくKG
.
2) ComboBox が実行したい自動検索動作を削除します。
次のようなフォームのメソッドハンドラーを使用して、これらのことの前に出ようとしました
ComboBox::DropDown() と ComboBox::DropDownClosed(),
しかし、これらはまだ基本的な ComboBox の検索/マッチングを停止することを許可していないようです。
また、ComboBox から継承した独自のクラスを作成しようとしましたが、何をオーバーライドすればよいのか、または一般に、必要なものを取得して不要なものを停止する方法がよくわかりません。
それでは、アドバイスをよろしくお願いします。
WndProc
編集:私がすでに試したことを拡張するには...継承されたクラスで、オーバーライドを使用しようとしていました。別のフォーラムで見つけたいくつかのアドバイスに基づいて、私の目標は ComboBox メッセージをインターセプトし、LB_FINDSTRING
それを に置き換えることLB_FINDSTRINGEXACT
でした。この投稿では、ComboBox のデフォルトがLB_FiNDSTRING
であることが示唆されており、これは私が見ている動作に適合しており、subbingLB_FINDSTRINGEXACT
で問題が解決することを示しています。問題は、 の悪い定義を取得しない限り、LB_FINDSTRING
受信されないことです。
ここに私の列挙型があります:
[Flags]
public enum ListBoxFlags
{
LB_ADDSTRING = 0x0180,
LB_SETSEL = 0x0185,
LB_GETSELITEMS = 0x0191,
LB_GETSELCOUNT = 0x0190,
LB_GETCURSEL = 0x0188,
LB_SELECTSTRING = 0x018C,
LB_SETCURSEL = 0x0186,
LB_FINDSTRING = 0x018F,
LB_FINDSTRINGEXACT = 0x01A2,
LB_GETCOUNT = 0x018B,
LB_GETSEL = 0x0187,
LB_GETTEXT = 0x0189,
LB_RESETCONTENT = 0x0184,
LB_SETHORIZONTALEXTENT = 0x0194,
LB_GETHORIZONTALEXTENT = 0x0193,
LB_GETTOPINDEX = 0x018E,
LB_SETTOPINDEX = 0x0197,
LB_INSERTSTRING = 0x0181,
LB_DELETESTRING = 0x0182,
LB_GETITEMDATA = 0x0199
}