0

ユーザーが 0..9、「.」のみを入力できるようにしたい。私のDGVでバックスペース。次のような KeyDown イベントがチケットである可能性があると思いました。

private void dataGridViewPlatypi_KeyDown(object sender, KeyEventArgs args)
{
    args.Handled = !args.KeyCode.Equals(Keys.Decimal); // etc. - add other allowed vals
    if (args.Handled)
    {
        args.SuppressKeyPress = true;
    }
}

...しかし、それは機能しません/効果がありません。

私はこれを調査して見つけました: DataGridView keydown event not working in C#

...これにより、これを使用してカスタム DGV クラスを作成することになりました。

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
    if ((!keyData.Equals(Keys.Decimal)) &&
        (!keyData.Equals(Keys.???))) // etc.
    {
        //suppress the key somehow
    }
    return base.ProcessCmdKey(msg, keyData); // <-- should this be in an "else" block?
}

...しかし、「???」からわかるように そして「どういうわけか」コメント、許可したい他のキー(0..9とバックスペース)をテストする方法がわかりません

アップデート

2 人の回答者からの有能な支援により、現在はうまく機能しています。

ここでは、移動可能な最終行の問題を解決するカスタム DGV 派生コントロールを作成するために、Hans Passant のコードから始めました。

C#でデータグリッドの空の灰色のスペースを削除する

...そして、LarsTech に基づいたコードを追加して、DGV 内の不要なエントリを除外しました。

正確には、これは ProcessCmdKey() をオーバーライドするために使用した正確なロジックです。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (char.IsNumber(Convert.ToChar(keyData)) || 
        char.IsControl(Convert.ToChar(keyData)) || 
        (keyData >= Keys.NumPad0 && keyData <= Keys.NumPad9) ||
        (keyData == Keys.Space) ||
        (keyData == Keys.Back) ||
        (keyData == Keys.Decimal))
    {
        return false;
    }
    return true;
}
4

1 に答える 1

1

テキスト入力コントロールのキーの処理が 100% になることはほとんどありません。このCode Projectの DataGridView で MaskedTextBox コントロールを使用して調査することをお勧めします。

オーバーライドについては、次のコードを使用すると、次のようになります。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (
    (keyData >= Keys.D0 && keyData <= Keys.D9) ||
    (keyData >= Keys.NumPad0 && keyData <= Keys.NumPad9) ||
    (keyData == Keys.Decimal | keyData == Keys.OemPeriod) ||
    (keyData == Keys.Back | keyData == Keys.Delete) ||
    (keyData == Keys.Left | keyData == Keys.Up | keyData == Keys.Right | keyData == Keys.Down) ||
    (keyData == Keys.Tab | keyData == Keys.Home | keyData == Keys.End | keyData == Keys.Enter)
    ) {
    return false;
  }

  return true;
}
于 2012-09-26T17:01:11.497 に答える