AutoPostback с TextBox теряет фокус
-
05-07-2019 - |
Вопрос
Для 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>