2

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

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

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

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

使用 ASP.NET 4.0、Visual Studio 2010。

4

1 回答 1

2

好的,我认为您的问题是您将所有内容都包含在更新面板中,我的方法是仅将更新面板用于需要更新的控件(也许您需要多个),更新面板需要具有 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。

于 2011-01-19T19:51:41.413 回答