アップグレードウィザードは、VB6.0 の ComboBox.Clear() を、ComboBox.Items.Clear() に置き換えます。

DropDownList の場合は、問題ないのですが、それ以外の場合、テキスト部分がクリアされません。

CB_RESETCONTENT を送ったら、テキスト部分もクリアされるはずなのに、なんでじゃー。と思って、ComboBox.cs を見ると

 /// <devdoc> 
 ///     Clears the contents of the combo box.
 /// </devdoc> 
 private void NativeClear() {
     Debug.Assert(IsHandleCreated, "Shouldn't be calling Native methods before the handle is created.");
     string saved = null;
     if (DropDownStyle != ComboBoxStyle.DropDownList) { 
         saved = WindowText;
     } 
     SendMessage(NativeMethods.CB_RESETCONTENT, 0, 0); 
     if (saved != null) {
         WindowText = saved; 
     }
 }

メッセージを送る前に、バックアップをとって、書き戻してるんですね。

しょうがないので、WndProc で CB_RESETCONTENT メッセージをキャッチし、次回の WM_SETTEXT を無視します。

 private bool _SetTextIgnore = false;
 
 protected override void WndProc(ref Message m)
 {
     switch (m.Msg) {
             ・
             ・
         case NativeMethods.CB_RESETCONTENT:
             // クリアされたときは -1 に戻します
             base.WndProc(ref m);
             m_NewIndex = -1;
 
             // .NET の ComboBox では、Items.Clear する際、テキストをバックアップし、クリアした後戻している
             // VB6 と互換にするには、次回の WM_SETTEXT を無視する
             if (this.DropDownStyle != ComboBoxStyle.DropDownList) {
                 _SetTextIgnore = true;
             }
             break;
 
         case NativeMethods.WM_SETTEXT:
             if (!_SetTextIgnore) {
                 base.WndProc(ref m);
             }
             _SetTextIgnore = false;
             break;
 
             ・
             ・
     }
 }



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-12-19 (木) 23:00:02 (1402d)