2013-03-20 145 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虽然]

相关问题