【问题标题】:Focus lost on partial postback with UserControls inside UpdatePanel使用 UpdatePanel 中的 UserControls 将注意力集中在部分回发上
【发布时间】:2014-12-26 03:14:18
【问题描述】:

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

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

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

我看到了一些解决方法,包括计算服务器端下一个要关注的字段并使用 ScriptManager.SetFocus(),在表单中传递下一个 UserControl,但我无法让它与我的用户控件一起使用。无论如何,这仍然感觉像是一个 hack,令人失望的是 UpdatePanel 并没有让这项工作发挥作用。

使用 ASP.NET 4.0、Visual Studio 2010。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了,以后试试这个。
    • 谢谢,这很有帮助。显然,将它们分成不同的更新面板效果更好。
    • 虽然这是一种解决方法,但这并不能解决更新控件必须位于 UpdatePanel 中的情况。这可能是出于设计原因,也可能只是页面的工作方式,但我遇到过几种情况,其中子级是触发器,它们不能移到 UpdatePanel 之外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多