Верните фокус обратно в правильное текстовое поле после функции автоматической отправки (Page.SetFocus не решает проблему)

Это МОЖЕТ выглядеть как дубликат, но это не так. Каждое решение в Интернете показывает, как сосредоточить внимание на текстовом поле, вызвавшем событие.

Но что, если пользователь нажимает вкладку? Текстовое поле, которое должно быть в фокусе, является следующим. Итак, мы делаем обходной путь и сосредотачиваемся на текстовом поле, у которого TabIndex выше, чем у того, которое вызвало событие.

Но что тогда, если пользователь нажимает Shift + Tab? Еще хуже: что, если пользователь нажимает на другое случайное текстовое поле?

Вот в чем проблема. Я не думаю, что здесь требуется код, потому что это общее решение, позволяющее сосредоточить внимание на текстовых полях, которые имеют функцию автоматической отправки. Если требуется код, спрашивайте в комментариях.


person Lucas    schedule 03.09.2015    source источник


Ответы (2)


Следующее позволит вам делать то, что вы хотите:

Нам нужно, чтобы js помогал с тем, какой элемент управления будет следующим, в этом случае любой элемент управления, который получает фокус (будь то вкладка, Shift-Tab, щелчок или любая другая комбинация элементов управления, выскакивающая из текстового поля на другой контроль). Используя WebMethod, мы можем передать эту информацию на сервер для фокусировки AutoPostBack.

WebMethod:

[WebMethod]
public static void set_nextFocus(string id)
{
    _toFocus = id;
}

Достаточно просто, _toFocus - это переменная класса static string _toFocus, она содержит значение следующего элемента управления, на который нужно сфокусироваться.

Page_Load

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        //sets focus to the proper control
        Page.SetFocus(Page.FindControl(_toFocus));
    }
}

JavaScript

in <head>

<script type="text/javascript">
    function setFocus(x) {
        PageMethods.set_nextFocus(x);
    }
</script>

Элементы управления ASP

В этом примере TextBox. Обратите внимание на использование OnFocusIn. Это атрибут expando элемента управления ASP, который поймет, что определение на стороне сервера отсутствует, и вернется к атрибуту javascript onfocusin.

<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" TabIndex="1" 
        ontextchanged="TextBox1_TextChanged" OnFocusIn="setFocus(this.id)" >
</asp:TextBox>

Кроме того, чтобы использовать PageMethods, вы должны включить его в форме, например:

<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
person Jason    schedule 03.09.2015
comment
Работает как шарм, отлично! - person Lucas; 04.09.2015

Вы можете проверить свойство __EVENTTARGET формы, которое сообщит вам имя текстового поля, из которого было вызвано событие. Сценарий, скажем, у меня есть два текстовых поля с именами TextBox1 и TextBox2, для обоих AutoPostBack установлено значение true и подключено событие textChanged к одному обработчику TextBox1_TextChanged. У вас может быть код ниже и вернуть фокус на конкретный элемент управления текстовым полем

    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        string target = Request.Form["__EVENTTARGET"];
        if (target == "Textbox2") //conrol name should be exact
        {
            Page.SetFocus(this.TextBox2);
        }
    }
person Rahul    schedule 03.09.2015
comment
Кажется, не работает, цель всегда TextBox1, так как событие TextChanged было вызвано TextBox1 - person Jason; 03.09.2015
comment
@Jason, целью будет текстовое поле, которое вызывает обратную передачу / обработчик. Может быть любое текстовое поле по форме в этом отношении. вероятно, это не сработало, потому что в имени элемента управления была опечатка. попробуйте сейчас, и он должен работать нормально. - person Rahul; 03.09.2015
comment
По-прежнему не работает, если вы заполняете текстовое поле, нажимаете вкладку, он входит в обработчик TextChanged, который _EVENTTARGET равен TextBox1, он не будет вводить оператор if для установки фокуса на следующий элемент управления - person Jason; 03.09.2015