Установите TabIndex для следующего элемента управления в ASP.Net

У меня есть страница ASP.Net 4.5.1, написанная на С#, на которой есть несколько текстовых полей. Когда текст в любом из текстовых полей изменяется, я хочу вызвать метод, который 1) включает кнопку «Сохранить» и б) перемещает фокус на текстовое поле со следующим TabIndex после текстового поля, вызвавшего обратную передачу. Вот мой код:

protected void EnableSaveButton(object sender, EventArgs e)
    {
        if ((REQUEST_PHASE)this.CurrentPhaseID == REQUEST_PHASE.RECORDS)
        {
            btnSaveACProperty.Disabled = false;
            Control control = (Control)sender;
            int tabindex = 0;
            if (control != null) 
            { 

            }
        }
    }

Что я хочу сделать, так это получить TabIndex элемента управления, а затем найти элемент управления с помощью TabIndex + 1 и выполнить для него SetFocus(). Моя проблема в том, что управляющая переменная в моем коде не имеет свойства TabIndex. Как мне это сделать?


person Melanie    schedule 13.04.2016    source источник
comment
Заставлять страницу отправлять сообщения на сервер каждый раз, когда изменяется текстовое поле, кажется плохой идеей. Вместо этого вы должны делать это в javascript.   -  person Richard Deeming    schedule 13.04.2016
comment
К сожалению, мне нужно проверить this.CurrentPhaseID в моем коде и делать это только тогда, когда для него установлено определенное значение. В противном случае я бы рассмотрел javascript. Но я могу решить игнорировать CurrentPhaseID, если выполнение этого на серверной части станет кошмаром. Так что спасибо за предложение.   -  person Melanie    schedule 13.04.2016
comment
Да: stackoverflow.com/questions/7208161/   -  person Richard Deeming    schedule 13.04.2016
comment
Спасибо за это. Это может пригодиться.   -  person Melanie    schedule 13.04.2016
comment
Ричард Диминг - если вы опубликуете свои предложения в качестве ответа, я отмечу это как ответ и проголосую за него. В очередной раз благодарим за помощь.   -  person Melanie    schedule 19.04.2016


Ответы (1)


Заставлять страницу отправлять сообщения на сервер каждый раз, когда изменяется текстовое поле, кажется плохой идеей. Гораздо лучше делать подобные вещи в Javascript.

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

$(function(){
    $("form").on("change", ":input", function(){
        $(":submit[name$=btnSaveACProperty]").prop("disabled", false);
        $.tabNext();
    });
});

Должно быть довольно просто включить или отключить эту функцию в зависимости от состояния сервера. Например, если вы поместите Javascript во внешний файл, вы можете условно включить его:

protected void Page_PreRender(object sender, EventArgs e)
{
    switch ((REQUEST_PHASE)this.CurrentPhaseID)
    {
        case REQUEST_PHASE.RECORDS:
        {
            Page.ClientScript.RegisterClientScriptInclude(
                typeof(REQUEST_PHASE), "MoveFocusOnChange", 
                "~/scripts/moveFocusOnChange.js");
            break;
        }
    }
}
person Richard Deeming    schedule 19.04.2016
comment
К сожалению, jquery не работает. Он не включает ни кнопку, ни вкладки для следующего элемента управления. Изучение DOM показывает мне элемент управления формой, в котором расположены все мои другие таблицы и элементы управления, поэтому я не уверен, почему. Если вы можете предложить что-то простое, чего мне не хватает, отлично. В противном случае, давайте отпустим; Я решил проблему с довольно неуклюжим javascript. PS - src, на который я указываю для jquery, - это jquery-1.4.1.js, который был включен в проект еще при его создании в .Net 2.0. - person Melanie; 20.04.2016
comment
@Melanie: Это действительно старая версия jQuery! Метод on был добавлен в версии 1.7; метод delegate был в 1.4.3; поэтому похоже, что вам придется использовать либо метод live, либо метод change для присоединения обработчика событий. - person Richard Deeming; 21.04.2016
comment
Итак, первая строка становится $(panel).live(function () { верно? - person Melanie; 22.04.2016
comment
@Melanie: Нет, к сожалению, метод live предшествует делегированным событиям. Это должно быть $(":input").live("change", function(){ ... }); или $(":input").change(function(){ ... });, если все входы уже существуют. - person Richard Deeming; 22.04.2016
comment
Хм, это не имеет никакого эффекта. У меня есть ‹script src=../../Scripts/jquery-1.4.1.js› $(function () { $(:input).live(change, function () { $(:submit[name $=btnSaveACProperty]).prop(отключено, ложь); $.tabNext(); }); }); ‹/script› Верно? - person Melanie; 25.04.2016
comment
@Melanie: Если предположить, что путь jQuery правильный, это выглядит правильно. Есть ошибки в консоли браузера? Что, если вы попробуете on вместо live? - person Richard Deeming; 25.04.2016
comment
@Melanie: Кроме того, вам может понадобиться использовать attr вместо prop. Я не думаю, что prop был доступен до версии 1.6. - person Richard Deeming; 25.04.2016
comment
Я пробовал оба предложения, но, похоже, он не работает. По крайней мере, кнопка никогда не становится активной. Никакие ошибки не всплывают. Это на самом деле не имеет большого значения, так как у меня это работает по-другому. Если с вами что-то случится, дайте мне знать, но в остальном не беспокойтесь об этом. И спасибо за всю вашу помощь! - person Melanie; 25.04.2016