情况如下:有一个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这个变量。
代码如下:[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这个变量。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货