4

数字のみを許可する DataGridViewTextBoxEditingControl から派生したカスタム EditingControl を定義した DataGridView (WinForms) があります。

ユーザーがキーを押すたびに DataGridView で CellValueChanged イベントを発生させる必要がありますが、デフォルトの動作では、編集が完了した場合にのみイベントが発生します。

キーが押されるたびにイベントを発生させるにはどうすればよいですか?

public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        e.Handled = Char.IsLetter(e.KeyChar);
        if (!e.Handled)
            RaiseDataGridViewCellValueChanged(); // <-- Any way?
    }
}

アップデート:

回避策を見つけましたが、それが良い解決策かどうかはわかりません:

public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        e.Handled = Char.IsLetter(e.KeyChar);
        if (!e.Handled)
        {
            EditingControlDataGridView.EndEdit();
            EditingControlDataGridView.BeginEdit(false);
        }
    }
}
4

1 に答える 1

1

ここでの目標は何ですか?キーボード マスクを作成しようとしているようですが、確認できない文字があるとアラートが発生しますか? その場合は、MaskedTextBoxColumn を追加することで、DataGridView に幸せを見つけることができます。MaskedTextBoxColumn は、編集コミットを強制するよりもはるかに合理的な方法で入力を制御します。

使用方法を示すコードについては、こちらを参照してください: http://msdn.microsoft.com/en-us/library/ms180996.aspx

コメントの更新された基準によると、あなたのソリューションはおそらく最高のものになるようです。ただし、キーボード イベントに基づいて別のコントロールを更新する他のコントロールがある場合、無限のイベント ループに陥りやすいことに注意してください状態に基づいてスプリアス イベントを破棄することで、イベント トリガーの無限ループを防ぐことができるため、すべてのイベントを処理する単一のデリゲートをフォームに配置することをお勧めします。

実質的には、デリゲートがプレゼンターとして機能し、ビュー (UI) のトラフィックを管理するモデル ビュー プレゼンター パターンを使用することになります。

これを行うと、Presenter ロジックを新しいクラスに移動してデータ バインドすることもでき、ごちゃごちゃしたイベント ハンドラーではなく、1 つの論理構造から UI を完全に制御できます。

于 2008-10-23T18:25:59.213 に答える