在我们的应用程序中,我们有一个用户用来编辑某些数据的属性网格,我被告知用户可以通过标签浏览的属性网格最有帮助。所以我创建了一个属性网格,用户可以通过它来查看所有数据。问题是,在他们查看了所有数据之后,我希望下一个标签按下按Tab键顺序转到下一个控件。
属性网格位于Tab键顺序的中间。我试图调整这里找到的解决方案:Validate Textbox Text and Increase the Tab Order Once,但没有运气。
如何在Property Grid中处理Tab的代码:
protected override bool ProcessKeyPreview(ref Message m)
{
int wParam = m.WParam.ToInt32();
switch (m.Msg)
{
case WM_KEYDOWN:
{
if (wParam == SHIFT)
{
isShiftDown = true;
return true;
}
}
break;
case WM_KEYUP:
{
if (wParam == TAB)
{
moveSelectedGridItem(!isShiftDown);
return true;
}
else if (wParam == SHIFT)
{
isShiftDown = false;
return true;
}
}
break;
}
return ProcessKeyEventArgs(ref m);
}
答案 0 :(得分:0)
我认为你所描述的行为不是WinForm控件的标准行为,通常用户必须按ESC
才能迭代到下一个控件,如果游标是“ inside “处理TAB
的控件。否则你必须实现像 RaiseSomeEventToParentControl 这样的东西我认为是不可能的或建议的。
答案 1 :(得分:0)
如果您有任何疑虑,我已经尝试过解决方法并通过它并回复我。
protected override bool ProcessKeyPreview(ref message m) { int wParam = m.WParam.ToInt32();
switch (m.Msg)
{
case WM_KEYDOWN:
{
if (wParam == SHIFT)
{
isShiftDown = true;
return true;
}
}
break;
case WM_KEYUP:
{
if (wParam == TAB)
{
bool ismoved = moveSelectedGridItem(!isShiftDown);
// First: modify the method "moveSelectedGridItem" to return bool value (if grid moved: true, if TAB pressed after last grid item: false)
if(!ismoved)
// handle your implementaion here
return true;
}
else if (wParam == SHIFT)
{
isShiftDown = false;
return true;
}
}
break;
}
return ProcessKeyEventArgs(ref m);
}