ComboBoxで右クリックしながら左クリックすると不具合
WinFormsのComboBoxで不可解なバグにぶちあたってしまいました。
ComboBoxStyle=DropDownListの(手入力不可、プルダウンから選択のみ可能な)コンボボックスですが、ソースコードからSelectedIndexなりSelectedItemなりで選択値を指定して画面表示した後、マウス右クリックを押しっぱなしにした状態でマウス左クリックすると、なぜか一瞬だけプルダウンが開かれてすぐ閉じられてしまった挙句、コンボボックスが未選択の状態に戻ってしまいます。
Web上で情報収集してみたところこんな情報があったり。
http://mitsu.three-atmarks.com/archives/9513
またプルダウンの選択値が一切ない状態だと例外が発生しまうようです。
http://okwakatta.net/topic/topic047.html
挙動を調べた限りでは、DropDownClosedイベントが動く時点ではすでにSelectedIndexは-1になってしまっているようで、このような右クリック+左クリック操作を行うとSelectedIndexが初期化されてしまう・・・という仕様というかバグのようです。
デザイナ上でのComboBoxのプロパティや小手先のイベントで回避できるものでもなさそうなので、以下のようにComboBoxを継承して対策してみることにしました。
public class ComboBoxEx : ComboBox { /// <summary> /// DropDownListのComboBoxを右クリックしながら左クリックした際の不具合対策 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { //DropDownListのComboBoxを右クリックしながら左クリックすると //・SelectedIndex==-1の未選択状態に戻ってしまう(もしくは直近選択値に戻ってしまう) //・Itemsが空の場合に例外が発生してしまう //という事象が発生してしまうため対策 const int WM_LBUTTONDOWN = 0x0201; if (m.Msg == WM_LBUTTONDOWN && (Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right) { //右クリックされている状態での左クリックメッセージは握りつぶす return; } base.WndProc(ref m); }
ComboBoxみたいなごくごく基本的なコントロール部品でも、こんなバグがあったりするんですね・・・・びっくりです。