Фокус потерян при частичной обратной передаче с помощью пользовательских элементов управления внутри UpdatePanel - PullRequest
2 голосов
/ 03 января 2011

У меня есть группа пользовательских элементов управления в форме внутри UpdatePanel AJAX, содержащая пару элементов управления, включая TextBox.

Каждый из этих пользовательских элементов управления составляет поле в форме ввода данных.В некоторых полях AutoPostBack включен и запускает событие, которое обновляет значение в другом поле формы на стороне сервера.

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

Я видел обходные пути, включающие разработку на стороне сервера поля, на котором нужно сосредоточиться, и использование ScriptManager.SetFocus (), передавая следующий UserControl в формено я не могу заставить это работать с моими пользовательскими элементами управления.Это все равно похоже на хак, и разочаровывает, что UpdatePanel не просто делает эту работу.

Использование ASP.NET 4.0, Visual Studio 2010.

1 Ответ

2 голосов
/ 19 января 2011

Хорошо, я думаю, что ваша проблема в том, что вы включаете все в панель обновлений, мой подход заключается в использовании панелей обновления только для элементов управления, которые необходимо обновить (возможно, вам потребуется более одного), панели обновления должны иметь UpdateMode = Условно и запускается только элементом управления, который влияет на внутренние элементы управления, элемент управления, выполняющий обратную передачу, должен находиться за пределами панели обновления, я публикую пример, который я уже протестировал и работает нормально.

<form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
    <div>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
    <asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True" 
                    ontextchanged="TextBox2_TextChanged"></asp:TextBox>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            </ContentTemplate>
            <Triggers>
            <asp:AsyncPostBackTrigger ControlID="TextBox2" />
            </Triggers>
        </asp:UpdatePanel>
    <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
        <br />
        <asp:TextBox ID="TextBox4" runat="server" AutoPostBack="True" 
            ontextchanged="TextBox4_TextChanged"></asp:TextBox>
        <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
            </ContentTemplate>
            <Triggers>
            <asp:AsyncPostBackTrigger ControlID="TextBox4" />
            </Triggers>
        </asp:UpdatePanel>
        <asp:TextBox ID="TextBox5" runat="server"></asp:TextBox>

Как вы можете догадаться, обновления TextBox2 Label1 и обновления Textbox4 Label2.

...