2013-03-20 192 views
1

在只能接受數字的gridview中有一個文本框類型列「數量」。代碼工作良好,但只能從第二個輸入。我只想在這裏使用keydown。事件僅從第二次觸發

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),那麼我應該如何在此編碼?

+1

一個問題,我覺得是要添加。事件處理程序每​​次都是壞的,你應該在添加之前首先刪除處理程序,或者先檢查null。 – nawfal 2013-03-20 16:25:29

+0

試過但沒有運氣.. Qty.KeyDown - = Qty_KeyDown; Qty.KeyDown + = Qty_KeyDown; – Ruby 2013-03-20 16:33:29

+0

我不知道什麼48和57對應,但爲什麼不嘗試'KeyCode'枚舉這樣的?像'如果e.KeyCode == Keys.Shift' ...壓制?? – nawfal 2013-03-20 16:37:12

回答

0

發現此行爲的原因:任何keydown(char,num或symbol)第一次直接進入'EditingControlShowing'方法而不是'KeyDown'。所以輸入已經被採納,因此問題。我用foll解決了這個問題。解決方法。 (取代的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; 
     } 
    } 

[我的第二個問題仍然unaswered雖然]

相關問題