我在AJAX UpdatePanel内的表单上有一堆用户控件,包含一些控件,包括一个TextBox。
这些用户控件中的每一个都构成数据输入表单上的字段。某些字段已启用AutoPostBack并触发一个事件,该事件会更新另一个表单字段服务器端的值。
但是,当部分回发返回并更新计算字段时,表单焦点将丢失 - 表单上的第一个字段将重新聚焦。因此,表单对于数据输入来说是无用的。
我见过的解决方法涉及解决服务器端哪个字段要关注下一个并使用ScriptManager.SetFocus(),传入表单中的下一个UserControl,但我无法使用它来处理我的usercontrols。无论如何,这仍然感觉像是一个黑客,并且令人失望的是,UpdatePanel不只是让这个工作。
使用ASP.NET 4.0,Visual Studio 2010。
答案 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。