AutoPostback с TextBox теряет фокус - PullRequest
6 голосов
/ 06 октября 2008

A TextBox установлено на AutoPostback, так как изменение значения должно привести к пересчету и отображению ряда (только для отображения) полей.
Это отлично работает.

Однако, когда поле выходит за пределы поля, фокус на короткое время переходит к следующему полю, а затем исчезает, когда страница перерисовывается, поэтому нигде нет фокусировки.

Я хочу, чтобы фокус был на новом поле, а не на текстовом поле, которое я только что изменил. Есть ли способ определить, какое поле имеет фокус, и заставить его иметь его снова, когда страница перерисовывается?

Ответы [ 3 ]

3 голосов
/ 06 октября 2008

Это "по замыслу". Если вы используете ASP.NET 2.0+, вы можете попробовать вызвать метод Focus вашего TextBox после того, как произойдет обратная передача (предпочтительно в событии TextChanged TextBox).

Я не уверен, есть ли какой-либо встроенный способ отслеживания фокуса, но я нашел эту статью в CodeProject, которая должна помочь.

1 голос
/ 24 октября 2011

Вот что происходит:

1) TAB на поле - клиентское событие
2) Сосредоточиться на следующем поле - клиентское событие
3) Postback - серверное событие
4) Перерисовка страницы - событие клиента, новая страница переопределяет события прежнего клиента

Решение вашей проблемы:

а) получить элемент, который получил фокус ДО обратной передачи

<script>
var idSelected;
 $("input").focusin(function () {
         idSelected = this.id;
    });
</script>

b) сохранить идентификатор клиента (фактически в var idSelected) где-то (т.е. скрытое текстовое поле, vith ViewState = true) ДО обратной передачи

** б) получить ClientID ** (извлечь из скрытого TextBox и поместить его в var idSelected) ПОСЛЕ постбэка

d) получить элемент с ClientID и установить фокус ПОСЛЕ постбэка

<script>
$(document).ready(function () {
  if (idSelected != null) {
       $("#" + idSelected).focus();
       idSelected = null;
     });
});
</script>

Примечание: в этом примере сценариев используется JQuery .
Не забудьте поставить Jquery.js в вашем решении и ссылку на вашей странице

<form id="form1" runat="server" enctype="multipart/form-data" method="post">
   <asp:ScriptManager   runat="server" >
  <Scripts>
   <asp:ScriptReference Path="~/Scripts/jquery.js" ScriptMode="Auto" />
....

Примечание 2: это решение работает без AJAX .
Посмотрите на этот ответ : чтобы Javascript работал над Ajax, вы должны использовать такой код:

<script type="text/javascript">
  Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);

  function EndRequestHandler(sender, args)
  {
    MyScript(); 
  }   
</script>
1 голос
/ 07 октября 2008

Также можно рассмотреть возможность обновления полей только для отображения, используя AJAX UpdatePanel . Таким образом, вы не потеряете фокус с нового поля.

Также я предложил чисто серверное решение на основе WebControl.Controls.TabIndex анализа, вы можете использовать его, если хотите.

...