我想大多数人都看过韩睿的关于重写datagridtablestyle的相关文章,里面涉及到了把combobox等控件嵌入datagrid,那么当我们也按照类似的方法重写后发现,他们在实际的应用中并不是很好用,比如说我们将一个参照的textbox控件嵌入到datagrid中后,不管是否在textbox中是否对键盘做了处理,结果到了在datagrid中使用键盘操作时发现,重写processcmdkey或者在textbox中加入了对回车键的处理后都有这样一个问题,键盘操作会被连续的触发2次,打个比方,我们的datatable 有4列,如果在第一列回车,那么光标会跳到第3列,而不是第2列,我们可以清楚的发现回车在第2列也被触发了一次。这是为什么呢?希望有高手做答!!!望赐教!

解决方案 »

  1.   

    我在对代码进行跟踪的时候发现,EDIT方法,COMMIT方法都被多次的触发了(2次),那么这究竟是为什么呢?是否我们在重写datagridtablestyle的时候少做了什么处理了呢?
    请大家多多发表意见!谢谢!
      

  2.   

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg , System.Windows.Forms.Keys keyData) //激活回车键
    {
    int WM_KEYDOWN=256;         
    int WM_SYSKEYDOWN = 260;
    if(this.ActiveControl is System.Windows.Forms.DataGridTextBox )
    {
       
    if(msg.Msg == WM_KEYDOWN | msg.Msg == WM_SYSKEYDOWN)
    {
    switch( keyData)
    { //case Keys.Down:
    // //MsgBox("截到下箭头键")
    // MessageBox.Show("下键");  
    // return true;
    // break;
    //case Keys.Up:
    // //MsgBox("截到上箭头键")
    // MessageBox.Show("上键");  
    // return true;
    case Keys.Enter: if(CheckDataGrid(this.dataGrid1) ==true)
    {
    switch (Dc.GetTextBoxName(dataGrid1,dataGrid1.CurrentCell.ColumnNumber).Name.ToString())
    {
    case "ITEM":
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    break;
    case "QTY":
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    break;
    case "PRICE":
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    break;
    case "LEAD_TIME":

    //SendKeys.Send("{Down}"); 

    SendKeys.Send("{Right}");
    SendKeys.Send("{Tab}");
    break;
     
    default:
    SendKeys.Send("{Tab}");
    break;
    }

    }
    return true;
    //break;
    //case Keys.Control + Keys.V:
    // //<CTRL> + C 组合键)
    // //if( Me.ActiveControl.Parent.GetType Is GetType(DataGrid) And Me.Txt_Type.Text <> "CHAO HUO" Then
    // //    keyData = Keys.NoName
    // //End If // return true;
    // break;
    //case Keys.Alt + Keys.Z://                    'MsgBox("<ALT> + z 组合键被截获")
    // return true;
    // break;
    }
    }
    }
    return false;
    }
      

  3.   

    试验了下,在嵌入控件中重写wndproc,监视了keyup,那么当消息是keyup的时候就return,可以使得DATAGRID中的TAB操作恢复成默认的方法(也就是说按下TAB就到下一列),可以如果再在datagrid中重写processcmdkey的话(主要是想让enter代替TAB),却发现没有作用,也就是说DATAGRID可以检测到按下了ENTER却不能成功的执行SENDKEYS(“{TAB}”)操作。这是为什么呢??望高手指点啊!!