0

記事DataGridView keydown event not working in C# に基づいて開発したコードに問題があります。

ユーザーが Dataviewgrid コントロールに行を追加できるようにしたかったのですが、AllowUserToAddRowsこれを有効にすると、新しい行の新しいセルに最初の文字が入力されるとすぐに追加の行が表示されることがわかりました。これは私の貧弱なユーザーにとって混乱を招く可能性があるため、これを防ぐために、上記の記事のコードを使用AllowUserToAddRowsして、すべてのキーストロークですぐに無効にしました (ただし、最初の文字が入力された後にのみ無効にすることをお勧めします)。ただし、これは入力された最初の文字を飲み込むようです。処理のために基本クラスに渡されません。完全なコードは次のとおりです。

public sealed class XDataGridView : DataGridView
{
    private bool _singleUpdateOnly = true;

    public bool SingleUpdateOnly
    {
        get { return _singleUpdateOnly; }
        set { _singleUpdateOnly = value; }
    }

    [Description("Disallows user adding rows as soon as a key is struck to ensure no blank row at bottom of grid")]
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {
        if (SingleUpdateOnly)
        {
            AllowUserToAddRows = false;
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

1 番目に入力した文字が飲み込まれるのはなぜですか? どうすればこれを防ぐことができますか? 私がコード化したものよりも良い方法はありますか?

4

1 に答える 1

0

このフォーラムや他のフォーラムで、この質問に対する回答はほとんどありませんでした。これは非常に難しい問題であるに違いありません。または、単にDataGridViewコントロールに期待しすぎているだけです。何時間もの試行錯誤の末、サブクラス化を必要としないソリューションに落ち着きました。つまり、ユーザーが新しく追加された行に入力を開始すると、グリッドの下部に別の行が追加されるのを防ぎますが、それに近づいています。イベントを使用してCellLeaveオフにしますAllowUserToAddRows. ユーザーが Tab または Enter を押して最初のセルにデータを入力すると、新しく追加された行がグリッドから効果的に削除され、ユーザーはグリッドの新しく追加された (最後) 行の次のセルに残ります (下に空の行はありません)。 )。エレガントではありませんが、少なくともほとんど機能的です。コードは次のとおりです。

private void uxContactEmailAddressesGrd_CellLeave(object sender, DataGridViewCellEventArgs e)
{
    uxContactEmailAddressesGrd.AllowUserToAddRows = false;
}

いつか他の誰かがこの問題に遭遇し、私よりも洗練された解決策を見つけるかもしれません。それは素晴らしいことです。他の人が使用できるように、ソリューションをこのサイトに投稿してください。

于 2012-12-18T22:04:55.077 に答える