我用了下面这事件,但事件不响应,大概是因为 datagrid中有TAB事件:private void dgSearch_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.KeyValue == 9)
{
this.dgSearch.Select(dgSearch.CurrentRowIndex + 1);
}
}

解决方案 »

  1.   

    你可以重写一datagrid的方法protected override void WndProc(ref System.Windows.Forms.Message m)试试
      

  2.   

    to:
       zzwsz
        谢谢你,我来试试!
        希望其他朋友能提供方法!
      

  3.   

    to:   zzwsz
        你能说具体点吗,这个方法我还不会写呢,从未写过此方法,谢谢!我也在看
      

  4.   

    给你一个从事例子:
    using System.Drawing;
    using System.Data;
    using System.Windows.Forms;namespace DataGridEX{
    public delegate void DeleteKey(ref System.Windows.Forms.Message msg);
    /// <summary>
    /// UserControl1 的摘要说明。
    /// </summary>
    public class DataGridEX : System.Windows.Forms.DataGrid
    {
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public DataGridEX()
    {
    // 该调用是 Windows.Forms 窗体设计器所必需的。
    InitializeComponent(); // TODO: 在 InitializeComponent 调用后添加任何初始化 } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if( components != null )
    components.Dispose();
    }
    base.Dispose( disposing );
    } #region Component Designer generated code
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器 
    /// 修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    // 
    // UserControl1
    // 
    this.Name = "DataGridEX";

    }
    #endregion public override bool PreProcessMessage(ref System.Windows.Forms.Message msg)
    {
    // if(msg.Msg==256)
    // {
    // System.Console.Write("\n"+msg.ToString ());
    // this.Select(this.CurrentRowIndex+1);
    // return(true);
    // }
    // else 
    // {
    // base.WndProc(ref msg);
    // return(false);
    // }
    if(msg.WParam.ToInt32()==46)
    {
    System.Console.WriteLine(msg.WParam.ToInt32().ToString()+"is catch!");
    //base.WndProc(ref m);
    this.DataGrid_DeleteKey(ref msg);
    return(true);
    }
    else
    {
    base.PreProcessMessage(ref msg);
    return(false); }
    }

    public event DeleteKey DataGrid_DeleteKey;

    }
    }
      

  5.   

    to: zzwsz
        还是没实现,不太清楚你这方法的用处,能再讲一下吗,不好意思了!
      

  6.   

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Windows.Forms;namespace DataGridEX{
    //public delegate void  TabKey(ref System.Windows.Forms.Message msg);
    /// <summary>
    /// UserControl1 的摘要说明。
    /// </summary>
    public class DataGridEX : System.Windows.Forms.DataGrid
    {
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public DataGridEX()
    {
    // 该调用是 Windows.Forms 窗体设计器所必需的。
    InitializeComponent(); // TODO: 在 InitializeComponent 调用后添加任何初始化 } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if( components != null )
    components.Dispose();
    }
    base.Dispose( disposing );
    } #region Component Designer generated code
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器 
    /// 修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    // 
    // UserControl1
    // 
    this.Name = "DataGridEX";

    }
    #endregion

    //public event  TabKey DataGrid_TabKey;//定义TAB键的事件
    public override bool PreProcessMessage(ref System.Windows.Forms.Message msg)//重写PreProcessMessage
    {
    System.Console.Write("\n"+msg.ToString ());
    if(msg.Msg==0x100&&msg.WParam.ToInt32 ()==9&&msg.LParam.ToInt32()==983041)//判断是否为TAB键
    {
    this.UnSelect(this.CurrentRowIndex);
    this.Select(this.CurrentRowIndex+1);
    this.CurrentRowIndex++;
    this.Refresh();
    return(true);
    }
    else 
    {
    return(false);//表示未作处理
    }


    }



    }
    }
    将以上代码编译成控件dll,然后在你的工程在添加引用,在并有DataGridEX代替DataGrid即可