C#从自定义属性网格转到Tab键顺序中的下一个控件

时间:2013-07-12 13:33:32

标签: c# propertygrid

在我们的应用程序中,我们有一个用户用来编辑某些数据的属性网格,我被告知用户可以通过标签浏览的属性网格最有帮助。所以我创建了一个属性网格,用户可以通过它来查看所有数据。问题是,在他们查看了所有数据之后,我希望下一个标签按下按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);
    }

2 个答案:

答案 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);
}