Връщане на фокуса към правилното текстово поле след функцията за автоматично връщане (Page.SetFocus не решава проблема)

Сега, това МОЖЕ да изглежда дубликат, но не е. Всяко решение в интернет ви показва как да фокусирате върху текстовото поле, което е задействало събитието.

Но какво ще стане, ако потребителят натисне tab? Текстовото поле, което трябва да има фокус, е следващото. Затова правим заобиколно решение и се фокусираме върху текстовото поле, което има TabIndex по-висок от този, който е задействал събитието.

Но какво ще стане, ако потребителят натисне Shift+tab? Още по-лошо: какво ще стане, ако потребителят кликне върху друго произволно текстово поле?

Това е проблемът. Не мисля, че кодът е необходим тук, защото това е общо решение за задаване на фокус върху текстови полета, които имат функция за автоматично обратно изпращане. Ако се изисква код, моля, попитайте в коментарите.


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


Отговори (2)


Следното ще ви позволи да правите това, което искате:

Това, което трябва да направим, е да накараме js да ни помогне с това коя контрола ще бъде следващата, в този случай всяка контрола, която получава фокус (независимо дали е чрез табулатор, преместване-табулация, щракване или каквато и да е комбинация от контроли, изскачаща от текстовото поле и върху различен контрол). Чрез използване на 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 контролата, който ще осъзнае, че няма дефиниция от страна на сървъра и ще се върне към атрибута onfocusin на javascript.

<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 на form, което ще ви каже името на текстовото поле, от което е било повдигнато събитието. Сценарий, да кажем, че имам две текстови полета с имена 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, целта ще бъде текстовото поле, което е причинило достигането на postback/манипулатора. Може да бъде всяко текстово поле във форма по този въпрос. вероятно не работи, защото името на контролата имаше печатна грешка. опитайте сега и трябва да работи добре. - person Rahul; 03.09.2015
comment
Все още не работи, ако попълните текстово поле, натиснете tab, той влиза в манипулатора TextChanged, който _EVENTTARGET е TextBox1, той няма да влезе в израза if, за да зададе фокуса на следващата контрола - person Jason; 03.09.2015