首页 > 解决方案 > 在聚焦到下一个文本框之前尝试在文本框中输入 1 或 2 位数字时需要帮助

问题描述

嗨,我正在尝试在 asp.net c# 的文本框中输入 1 或 2 位数字。我想关注下一个文本框。这是我的代码,但它引发了一个错误,即正在从创建它的不同线程访问 textbox1。

私人无效 textBox19_TextChanged(对象发送者,EventArgs e){

线程 t = new Thread(() => { Thread.Sleep(2000); textBox1.Focus();` } ); t.Start(); }

标签: asp.net

解决方案


好的,首先,您需要掌握并理解往返的概念。

接下来,文本更改事件不会触发,直到用户完成在该文本框中输入并点击 TAB。因此,您不能真正使用背后的代码进行按键处理。

当您点击选项卡时,会发生回发。这是往返旅程最重要的开始。如果你不绝对把握这个概念,那么你在 asp.net 页面上的所有尝试都将丢失,你将永远 100% 丢失。你必须,绝对必须掌握这个概念。

所以我们的往返:

单击按钮,或触发 htat 控件的事件(按键处理将不起作用 - 它是当用户点击选项卡时)。

因此,在该控件上单击按钮或选项卡。

Post back occures
The WHOLE web page travels up to the server.
When we say whole page, we mean ALL of the browser HTML, all of the whole page
This includes all controls, all graphics, all HTML - the whole deal
Now the page is at the server.
The asp.net processes the market.
THEN your code behind runs. At this point your event code runs
In your event code, you can say modify a value of a control.

Now:
Then the WHOLE PAGE travels back to the browser and is refresed and displald.
The page is now sitting back on the client side browser.
So as the user types. Clicks into a text box etc.? The browser is allowing this.
The server is not being talked to (unless you trigger another post-back (round trip).

那么,当用户在那个文本框中输入内容时呢?当用户正在编辑该文本框?这是所有发生的浏览器端。您没有与服务器交谈,并且不会发生这些往返。

因此,您不能说在文本框上放置一些计时器并查看/检查/查看/希望更改您的代码所看到的内容。在页面回发发生并且往返开始之前,这些代码都不会运行。

往返很昂贵,通常不适合按键处理。如果您要为每个按键设置一个完整的页面回传,那么每个按键都将就像一个提交按钮 - 整个页面必须返回到服务器。

那么,既然你掌握了上述内容?好吧,那么您不能循环/池/测试服务器上带有代码的文本框的值您只能在发送整个网页后查看/使用/检查/修改/播放表单上的控件到服务器。因此单键按压处理是不实用的。

好的,那么我们可以在这里做什么?

最简单的是使用客户端代码。只需检查文本框的长度,如果是 2 个字符,则将焦点设置到另一个控件。

所以,让我们在表单上放置一个文本框,我们可以使用这个标记来实现它:

<asp:TextBox ID="TextBox3" runat="server"
   onkeyup="mykeycheck()" >
</asp:TextBox>
<script>
 function mykeycheck() {
     vTextBox = document.getElementById('<%= TextBox3.ClientID %>');
     if (vTextBox.value.length == 2) {
        document.getElementById('<%= TextBox1.ClientID %>').focus();
     }
  }
</script>

所以,现在,我们的重点将跳转到 Textbox1,我们没有任何服务器端代码。

我们可以“以某种方式”进行单键按下检查并运行服务器端代码吗?

嗯,是的,你可以。但是话又说回来,会发生巨大的往返过程。

但是,我想我们可以引入一个更新面板。这表明文本框在更新面板的外部,我们可以说例如显示文本框的结果,并为每次按键运行代码。我可以发布代码以及如何执行此操作,但总的来说,每次按键都有一个完整的往返行程与为您按下的每个按键都有一个提交按钮的想法非常相似 - 非常重。

所以,我不能强调记住运行/使用/让代码与网页交互的绝对重要性,它只能在页面发布到的那个“小”时间里这样做服务器,您的代码运行,然后整个页面现在重新发送回浏览器端。而且您后面的代码只能看到/触摸/修改/使用该页面上的控件,而该页面在该往返期间位于服务器上。但它不会在那里停留很长时间 - 在您的所有代码运行之后,整个页面现在被发送回客户端。这也意味着即使是简单的东西,比如你在文本框中的光标位置也会丢失。你可以非常想像你刚刚按下刷新键一样的往返过程。

因此,您无需在文本更改事件中使用也不需要任何代码。但是,请记住,当我们使用上面的客户端 JavaScript 时,当我们更改焦点时,如果您仍然连接了服务器端文本更改事件(并且该文本框的 postback = true),那么服务器端代码将运行,并且将发生回发。既然我们真的不需要也不希望发生回发,那么我们当然会删除该文本更改的代码存根,并关闭该文本框的回发设置。


推荐阅读