0

我现在将跳过我的代码;应该更容易用文字来描述。

到目前为止,我有以下逻辑工作:

  1. 我有一个输入文本框,当用户输入错误的文本时,我会显示一条错误消息并将焦点返回到文本框。
  2. 当用户不输入任何内容或删除那里的内容并离开文本框时,它会进行一些处理,但其他方面的行为与它一样 - 按 Tab 顺序跳转到下一个控件。
  3. 如果我关闭 Tab,如果我按下 Shift-Tab 或专注于我用鼠标单击的任何内容,则跳转到上一个控件。
  4. 如果我为某些可以自动完成的文本输入唯一前缀,例如可以自动完成为“朝鲜蓟”的“articho”,则代码会自动填充旁边的另一个只读文本框并跳过到只读文本框的下一个邻居。注意:如果我 Shift-Tab 使用相同的输入,那么它的作用相同,但在这种情况下我想执行不同的逻辑。
  5. 就像 4. 但是如果我通过单击鼠标离开,那么代码会自动填充文本框 - 很好,但它也会选择我想要的控件。

现在坏掉的是4的光头部分。如果我尝试使用 Shift-Tab 向后循环所有交互式(而不是标签或禁用的)控件,我不能 - 我的自定义逻辑每 4. 启动并将焦点向前发送。只有当我在手头的文本框中填写了一些东西时,这才是一个问题,但我仍然想修复这个边缘情况。

有什么想法吗?问题?

PS我不知道如何回答“你试过什么?” 除了说我使用 WinForms 几个月而且我不知道如何在这里继续之外的其他类型的问题。谢谢。

4

2 回答 2

0

这就是我的做法。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace LeaveTest {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        protected override void OnLoad(EventArgs e) {
            base.OnLoad(e);
            textBox2.LostFocus += new EventHandler(textBox2_LostFocus);
        }

        void textBox2_LostFocus(object sender, EventArgs e) {
            Control newControl = GetCurrentControl();
            Control prevControl = GetPrevControl(textBox2);
            Control nextControl = GetNextControl(textBox2);

            if (newControl.Handle == prevControl.Handle) {
                MessageBox.Show("Case 4");
            }
        }

        [DllImport("user32.dll")]
        static extern IntPtr GetFocus();

        [DllImport("user32.dll")]
        static extern IntPtr GetNextDlgTabItem(IntPtr hDlg, IntPtr hCtl,
           bool bPrevious);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);

        enum GetWindow_Cmd : uint {
            GW_HWNDFIRST = 0,
            GW_HWNDLAST = 1,
            GW_HWNDNEXT = 2,
            GW_HWNDPREV = 3,
            GW_OWNER = 4,
            GW_CHILD = 5,
            GW_ENABLEDPOPUP = 6
        }


        private Control GetCurrentControl() {
            IntPtr hWnd = GetFocus();
            Control control = Control.FromHandle(hWnd);
            return control;
        }

        private Control GetNextControl(Control ctrl) {
            // I know the last parameter looks wierd, but it works
            IntPtr hWnd = GetNextDlgTabItem(ctrl.Parent.Handle, ctrl.Handle, true);

            Control control = Control.FromHandle(hWnd);
            return control;
        }

        private Control GetPrevControl(Control ctrl) {
            // I know the last parameter looks wierd, but it works
            IntPtr hWnd = GetNextDlgTabItem(ctrl.Parent.Handle, ctrl.Handle, false);
            Control control = Control.FromHandle(hWnd);
            return control;
        }
    }
}
于 2012-08-08T01:44:20.330 回答
0

可能您可能想尝试文本框的 PreviewKeyDown 事件,您可以在其中识别被按下的组合键并执行不同的逻辑,如果它是 Shift + Tab 按键。

于 2012-08-07T23:48:37.650 回答