Нужна помощь при попытке ввести 1 или 2 цифры в текстовое поле перед переходом к следующему текстовому полю

#asp.net

#asp.net

Вопрос:

Привет, я пытаюсь ввести 1 или 2 цифры в текстовое поле в asp.net c#. Я хочу сосредоточиться на следующем текстовом поле. Вот мой код, но он выдает ошибку, что доступ к textbox1 осуществляется из другого потока, в котором он был создан.

private void textBox19_TextChanged(отправитель объекта, EventArgs e) {

Поток t = новый поток (() => { Поток.Sleep (2000); TextBox1.Focus();` } ); t.Start(); }

Комментарии:

1. и в чем причина потока и сна в этом событии?

Ответ №1:

Хорошо, сначала вам нужно понять и понять концепцию обхода.

далее событие изменения текста НЕ запускается, пока пользователь не закончит вводить текст в этом текстовом поле и не нажмет TAB. Таким образом, вы не можете выполнять обработку нажатия клавиш с помощью кода.

Когда вы нажимаете tab, происходит обратная запись. Это САМОЕ ВАЖНОЕ начало поездки туда и обратно. Если вы не с абсолютной уверенностью понимаете эту концепцию, тогда все ваши усилия в asp.net страницы будут потеряны, и вы навсегда останетесь на 100% потерянными. вы должны, абсолютно должны понять эту концепцию.

Итак, наше путешествие туда и обратно:

Нажимается кнопка или запускается событие для управления htat (обработка нажатия клавиш не будет работать — это КОГДА пользователь нажимает tab).

Итак, нажмите кнопку или вкладку на этом элементе управления.

 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 для этого текстового поля), тогда будет запущен код на стороне сервера, и сообщение обратно. Поскольку мы действительно не нуждаемся и не хотим, чтобы выполнялась обратная передача, тогда, конечно, мы удалим эту заглушку с измененным текстом и отключим настройку обратной передачи для этого текстового поля.

Комментарии:

1. Спасибо, Альберт, следующий код работает для 2 цифр, затем фокус перемещается в текстовое поле 1. Но я ищу вариант ввода 1 или 2 цифр./* var score = textBoxhcap.Text.Length>1 ; if (score) { TextBox1 . Focus(); }*/

2. Гул, не на 100% ясно. Итак, если пользователь вводит 2 цифры — перейдите к какому-либо текстовому полю. Но если они вводят 1 цифру, то что должно произойти? Вы имеете в виду, если я введу 1 цифру, затем посмотрю на свою статью и, прежде чем вводить 2-ю цифру, она будет прыгать, и мне не разрешат ввести эту 2-ю цифру через некоторое время? (вам платят за разработку самого запутанного пользовательского интерфейса в мире на этой планете?). Итак, неясно, как вы собираетесь решить, хочет ли пользователь (или нет) ввести эту 2-ю цифру. Я имею в виду, либо они вводят 1-значную вкладку, либо они привыкают вводить 01, чтобы избавить их от необходимости нажимать tab.

3. Привет, Альберт, это карточка для подсчета очков, где у конкурента может быть 5 0r 2 0r 12 и так далее.

4. правильно, поэтому для сверхбыстрого ввода данных они могут ввести 05, и он перейдет к следующему текстовому полю, не отрываясь от клавиатуры. Если они наберут 5, как долго они должны ждать, прежде чем он перейдет? если в текстовом поле должна быть 1 цифра, обязательно переходите к следующему. Но если у них есть выбор из 1 или 2 цифр, то я думаю, что это натяжка, чтобы иметь некоторую жесткую задержку кода, при которой они вводят 1 цифру и ЖДУТ перехода курсора. На самом деле это не способствует быстрому вводу с клавиатуры. Либо они нажимают 5, затем tab, либо вводят 05, чтобы перейти к следующему. Наличие некоторой временной задержки только помешает им.

5. Да, Альберт, это делает именно то, что я хочу void Stop() { Thread t = new Thread(() => { Thread . Sleep (2000); textBoxhcap. Вызвать(новый методinvoker(delegate () { TextBox1. Фокус(); })); } ); t.Start(); }