使用UpdatePanel内的UserControls重点丢失部分回发

时间:2011-01-03 11:11:36

标签: asp.net user-controls focus updatepanel setfocus

我在AJAX UpdatePanel内的表单上有一堆用户控件,包含一些控件,包括一个TextBox。

这些用户控件中的每一个都构成数据输入表单上的字段。某些字段已启用AutoPostBack并触发一个事件,该事件会更新另一个表单字段服务器端的值。

但是,当部分回发返回并更新计算字段时,表单焦点将丢失 - 表单上的第一个字段将重新聚焦。因此,表单对于数据输入来说是无用的。

我见过的解决方法涉及解决服务器端哪个字段要关注下一个并使用ScriptManager.SetFocus(),传入表单中的下一个UserControl,但我无法使用它来处理我的usercontrols。无论如何,这仍然感觉像是一个黑客,并且令人失望的是,UpdatePanel不只是让这个工作。

使用ASP.NET 4.0,Visual Studio 2010。

1 个答案:

答案 0 :(得分:2)

好吧,我认为你的问题是你在updatepanel中包含了所有内容,我的方法是仅将updatepanel用于需要更新的控件(可能需要多个),updatepanels需要有UpdateMode =条件并且仅由影响内部控件的控件触发,执行回发的控件应该在updatepanel之外,我发布了一个我已经测试并且工作正常的示例。

<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。