情况如下:有一个TabControl控件,有3个Page,每个Page中有一个DataGridView控件,每个DataGridView都要求最后1行自动添加1个新行,我现在的情况是,在第1个DataGridView中,用Tab键跳到新行后,就不往下跳了,我想要的效果是,当跳到第1个DataGridView新行(也就是最后1行)时,再按Tab键,我就让TabControl跳到第2个Page,并且第2个DataGridView获得焦点。现在关键问题是,在DataGridView获得焦点后,Tab键、Enter键是让DataGridView处理的,窗体上截获不了Tab键,请问有知道怎么处理的吗?我现在是使用钩子函数来做的,但是,使用这个又有个问题,在我的钩子回调函数中,无法使用DataGridView控件的实例。
代码如下:[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private static LowLevelKeyboardProc _proc = HookCallback;
        private static IntPtr _hookID = IntPtr.Zero;        private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using(Process curProcess=Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
            }
        }
        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            //if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            //{
            //    int vkCode = Marshal.ReadInt32(lParam);
            //    MessageBox.Show(((Keys)vkCode).ToString());            //}            int vkCode = Marshal.ReadInt32(lParam);
            if (((Keys)vkCode) == Keys.Tab)
            {
                if(grid..........)
                {                }
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
就是在if(grid.......)这儿,想判断DataGridView的最后一行,但是现在在这个函数中找不到grid这个变量。

解决方案 »

  1.   

    直接设置tab index有用吗?
      

  2.   

    这还用钩子?grid的keydown或keypress中判断,如果是tab并且是最后一行,就切换,如果这里不好捕获,还可以用过滤器捕获消息(IMessageFilter)
      

  3.   

    你在KeyDown事件中截获Tab键试试?
      

  4.   

    知道了,犯了个很二的错误,上面的函数是static,不写成这个就可以了。