1

winforms を使用して、KeyPreview プロパティを true に設定し、ベース フォーム内にも適切なキー イベントのイベント ハンドルを設定しました。

それを継承するフォーム内で、アプリケーションの要件に基づいて AcceptButton プロパティを設定します。

Enter キーに AcceptButton とは異なる機能を持たせたい場合があります。

基本フォーム内で Enter キーの押下をキャプチャし、AcceptButton イベントを発生させたくない特殊なケースを確認したいと考えていました。

ただし、私のbasefフォーム内のキーイベントの前に AcceptButton クリックが発生するようです。私は可能なacceptbuttonsのクリックイベントに機能を書くことができましたが、私の意見では、それはハックになるでしょう.

助言がありますか?

ありがとう。

4

2 に答える 2

2

これを処理する別の方法は、フォームの ProcessDialogKey() メソッドをオーバーライドすることです。このメソッドでは、同意ボタンやキャンセル ボタンを非表示にすることができます。たとえば、ユーザー入力に基づいてグリッドをフィルター処理するフィルター エディターを備えたアプリケーションがあります。フィルター エディター コントロールにフィルターを適用するフォーカスがあるときに、ユーザーがリターン キーを押せるようにしたいと考えています。問題は、承認ボタンのコードが実行され、フォームが閉じられることです。以下のコードは問題を解決します。

    protected override bool ProcessDialogKey(Keys keyData)
    {
        // Suppress the accept button when the filter editor has the focus.
        // This doesn't work in the KeyDown or KeyPress events.
        if (((keyData & Keys.Return) == Keys.Return) && (filterEditor.ContainsFocus))
            return false;

        return base.ProcessDialogKey(keyData);
    }

次のコードをベース ダイアログ フォームにドロップすることで、これをさらに進めることができます。次に、必要に応じて、サブクラスのコントロールの承認ボタンを抑制できます。

    private readonly List<Control> _disableAcceptButtonList = new List<Control>();

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (((keyData & Keys.Return) == Keys.Return) && (_disableAcceptButtonList.Count > 0))
        {
            foreach (Control control in _disableAcceptButtonList)
                if (control.ContainsFocus)
                    return false;
        }

        return base.ProcessDialogKey(keyData);
    }

    protected virtual void DisableAcceptButtonForControl(Control control)
    {
        if (!_disableAcceptButtonList.Contains(control))
            _disableAcceptButtonList.Add(control);
    }
于 2009-08-06T19:56:27.210 に答える
0

回避策として、acceptbutton 機能をオーバーライドしたいコントロールの enter および leave イベントをキャプチャしました。enter イベント内で、現在の承認ボタンをプライベート変数に保持し、acceptbutton を null に設定しました。休暇中は、acceptbutton を保持していたプライベート変数に再割り当てします。

KeyPreview イベントは、上記と同様のことを行うことができました。誰かがよりエレガントなソリューションを持っている場合でも、知りたいです。

ありがとう。

于 2009-04-21T13:24:58.887 に答える