0

我有一个类(ChorNumbers),在这个类中我有一个测试 textbox1...17 是字符还是数字的函数。

我创建了一个有 9 个文本框的 WindowsForm。如果我在必须跳转到下一个 textbox2 的 textbox1 中输入 1(执行此操作) 如果我在必须跳转到 textbo3 的 textbox2 中输入 A,但它们不会跳转。为什么它不跳转的问题在哪里?

我想使用一个 textbox1_TextChanged 函数。

 private void textbox1_TextChanged(object sender, EventArgs e)
 {
        TextBox myText = (TextBox)sender;
        ChorNumbers myNR = new ChorNumbers();

        bool _focused = false;
        if (myNR.CheckTextbox(myText.Name, myText.Text) == false)
            foreach (Control ctrtb in base.Controls)
                if (ctrtb is TextBox && _focused == false)
                {
                    _focused = ctrtb.Focused;
                }
                else if (ctrtb is TextBox && _focused == true)
                    ctrtb.Focus();
 }

我有我不想使用的解决方案。我只想要一个 textbox1 函数用于其他文本框

    private void textbox3_TextChanged(object sender, EventArgs e)
    {
        TextBox myText1 = (TextBox)sender;
        ChorNumbers myNR1 = new ChorNumbers();

        if (myNR1.CheckTextbox(myText1.Name, myText1.Text) == false)
        {
            textbox4.Focus();
        }
    }
4

4 回答 4

0

你为什么不试试:

if textbox2.text = "A" then
    'whatever you want, for exapmple:
    textbox3.text = textbox2.text
end if

而不是 if textbox2.text = "A" 那么你也可以使用类似的东西:

if not textbox2.text = nothing then
end if

这不是比你尝试的容易得多吗?

于 2012-06-16T18:44:58.277 回答
0
  1. 编写一个事件处理程序来处理所有文本框的 TextChanged 事件:

     private void textbox_TextChanged(object sender, EventArgs e)
     {
            TextBox txtBox = (TextBox)sender;
    
            // Either write your own character/number and focus moving logic here 
            // Or the following
            char ch = txtBox.Text.Trim()[0];
            switch(txtBox.Name){
                case "textbox1":
                    if(Char.IsDigit(ch))
                        textbox2.focus();
                break;
                case "textbox2":
                    if(Char.IsLetter(ch))
                        textbox3.focus();
                break;
    
                ... // rest of the cases
            }
     }
    
  2. 在设计时,选择textbox1,转到 Properties > Events > TextChanged 并textbox_TextChanged在那里绑定。对其余的文本框执行相同的操作。
于 2012-06-16T19:13:52.993 回答
0

经过

我有我不想使用的解决方案。我只想要一个 textbox1 函数用于其他文本框

你的意思是你只希望每个文本框调用一个回调函数,然后(如果填充正确)传递到下一个?如果是这样,那么那部分就很简单了,只需将每个事件处理程序指向相同的方法(尽管它可能会变得复杂,除非每个事件处理程序的验证完全相同 - 因此,每个文本框都有一个可能会更好)。

我认为您的问题将是一个标准问题-您试图在该控件完成处理之前在该控件调用的事件期间更改焦点。也就是说,textbox1 在被填充时触发您捕获的事件 - 在您的捕获(回调)方法中您更改焦点 - 现在处理返回到 textbox1(在您的回调方法的返回/结束时)并且焦点被切换为副产品(因为克拉正在为 textbox1 的下一次更新做好准备)。

一种解决方案是在几毫秒后调用一个定时事件,然后在处理返回到文本框并返回等待消息状态后,定时事件启动焦点(跳转)。

您也可以尝试将启用设置为强制并查看是否强制当前控件通过(尽管需要排序制表位)

于 2012-06-16T19:41:45.630 回答
0

那是我的函数 ChorNumbers

 public bool ChorNumbers(string Name, string _Text)
        {
            bool error = false;
            if (_Text.Length < 1)
            {
                error = true;
                return error;
            }

                if (Name == "textbox1" && _Text.Length == 1)
                {
                    if (!Regex.IsMatch(_Text, "^[0-9\\s]"))
                    {
                        MessageBox.Show("Only Number and Space!");
                        error = true;
                    }
                }
                if (Name == "textbox2" && _Text.Length==1)
                {
                    if (!Regex.IsMatch(_Text, "^[a-zA-z]"))
                        {
                            MessageBox.Show("Only Character!");
                            error = true;
                        }
                 }

           // textbo3 ... textbox17


    return error;
  }
于 2012-06-17T08:08:38.797 回答