Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Это то, что происходит:

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

Решение вашей проблемы заключается в следующем:

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

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

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

** b) получить 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top