ComboBoxの返却は必ず提出イベントをトリガーします

1603 ワード

ドロップダウンリストが展開されているかどうかにかかわらず、リターンは必ずコミットイベントをトリガーし、Escはキャンセルイベントをトリガーし、予想外の結果をもたらします.
MSDNには、
ComboBox.IsInputKeyメソッド
protected override bool IsInputKey(
        Keys keyData
)
keyDataパラメータにReturnまたはEscape値が含まれ、DroppedDownプロパティがtrueの場合、IsInputKeyメソッドはtrueを返します.
本来なら、ドロップダウンリストが展開されている間に車に戻ってもコミットイベントはトリガーされず、Escもキャンセルイベントはトリガーされませんが、事実はそうではありません.原因は何ですか.
テストコード:
public class ComboBoxEx: ComboBox {
    protected override bool IsInputKey(Keys keyData)
    {
        if (DroppedDown)
            switch (keyData) {
                case Keys.Return: return true;
                case Keys.Escape: return true;
            }
        return base.IsInputKey(keyData);
    }
}
は、ドロップダウンリストが開いていないときに、DroppedDownがfalse、IsInputKey()として実行され、動作が予想されることをデバッガを介して見ることができる.ドロップダウンリストが開くと、IsInputKey()は奇妙に2回実行され、1回目のDroppedDownはtrue、2回目のDroppedDownはfalseとなり、IsInputKey()は虚構となり、予想外の結果をもたらす.
ソリューション:
public class ComboBoxEx: ComboBox {
    protected bool DroppedDownBak = false;
    protected override bool IsInputKey(Keys keyData)
    {
        if (DroppedDown || DroppedDownBak) {
            if (DroppedDownBak) DroppedDownBak = false;
            if (DroppedDown) DroppedDownBak = true;
            switch (keyData) {
                case Keys.Return: return true;
                case Keys.Escape: return true;
            }
        }
        return base.IsInputKey(keyData);
    }
}