1

数字のみを受け入れる必要があるグリッドビューに、テキストボックスタイプの列「数量」を設定します。コードは正常に機能しますが、2番目の入力からのみ機能します。ここではキーダウンのみを使用します。

private void GridViewSale_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{     
  if (GridViewSale.CurrentCell.ColumnIndex == 4) //Allow only numbers for QTY column
    {
      TextBox Qty = e.Control as TextBox;
      Qty.KeyDown += new KeyEventHandler(Qty_KeyDown);
    }
}
void Qty_KeyDown(object sender, KeyEventArgs e)
{         
  if ((e.KeyValue >= 48 && e.KeyValue <= 57) || (e.KeyValue >= 96 && e.KeyValue <= 105)//Allows numerics
    e.SuppressKeyPress = false;
  else
    e.SuppressKeyPress = true;           
  }

1.すべての入力に対して機能するように、form_load ..などの他の場所でイベントハンドラーを呼び出す必要がありますか?
2.修飾子入力(SHIFT + 1、SHIFT + 2)を無効にする必要がある場合、ここでどのようにコーディングする必要がありますか?

4

1 に答える 1

0

この動作の理由が見つかりました: 初めてのキーダウン (文字、数値、または記号) は、'KeyDown' ではなく 'EditingControlShowing' メソッドに直接行きます。そのため、入力は既に取得されているため、問題が発生します。私はこれをフォールで解決しました。回避策。(KeyDown を PreviewKeyDown に置き換え、CellBeginEdit を追加して、セルが編集モードに入る前にキー値を確認します。

private void GridViewSale_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
  {
    if (GridViewSale.CurrentCell.ColumnIndex == 4)//Allow only nums for QTY col.
          {
              TextBox Qty = e.Control as TextBox;
              Qty.KeyDown -= OnlyNums_KeyDown;
              Qty.KeyDown += OnlyNums_KeyDown;
          }
  }
private void GridViewSale_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  {
     if ((e.KeyValue >= 48 && e.KeyValue <= 57) || (e.KeyValue >= 96 && e.KeyValue <= 105))
          {
              //Do Nothing
          }
          else
          {
              cancelEdit = true;
              GridViewSale.CellBeginEdit -= GridViewSale_CellBeginEdit;
              GridViewSale.CellBeginEdit += GridViewSale_CellBeginEdit;
          }
      }
private void GridViewSale_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
  {
      if (cancelEdit == true)
      {
          e.Cancel = true;
          cancelEdit = false;
      }
  } 

[私の2番目の質問はまだ回答されていません].

于 2013-03-25T06:32:01.563 に答える