所以,我有一个带有更新面板的usercontrol。 我还放了一个按钮来更新我控制的面板。 我在页面中包含此控件2次(或更多)。 我只想更新其中一个但是当我使用按钮时,两个面板都会更新。
控制ascx
<script type="text/javascript">
function bt_click()
{
__doPostBack('UpdatePanel1', 'post');
return false;
}
</script>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:HiddenField runat="server" ID="HiddenField1" Value="false" />
<div>
<asp:Label ID="Label1" runat="server" Text="Val"></asp:Label>
</div>
</ContentTemplate>
</asp:UpdatePanel>
控制.vb
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Label1.Text = DateTime.Now.Ticks.ToString();
}
}
webform.aspx
<form id="form1" runat="server">
<div>
<asp:Button runat="server" ID="bt" OnClientClick="bt_click" />
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:Label ID="Label1" runat="server" Text="Val"></asp:Label>
<div>
<My:MyControl ID="MyControl1" runat="server" />
</div>
<br />
<div>
<My:MyControl ID="MyControl2" runat="server" />
</div>
</div>
</form>
webform.vb
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
Label1.Text = DateTime.Now.Ticks.ToString();
}
答案 0 :(得分:1)
编辑工作解决方案:
以下是错误:您的Button1
位于UpdatePanel之外,因此用它回发您的页面和所有控件。因此,他们两个都在更新。您无法在控件的Triggers
部分添加按钮,因为显然控件不知道它。所以你要做的就是将该按钮注册为异步PostBack控件。这是我做的:
<强> TestControl.ascx:强>
注意:我必须将UpdateMode="Conditional"
添加到您没有的UpdatePanel。默认情况下,UpdateMode设置为Always,这将导致我们进一步的问题。
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="TestControl.ascx.cs" Inherits="Controls_TestControl" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:HiddenField runat="server" ID="HiddenField1" Value="false" />
<div>
<asp:Label ID="Label1" runat="server" Text="Val"></asp:Label>
</div>
</ContentTemplate>
</asp:UpdatePanel>
<强> TestControl.ascx.cs:强>
注意:我添加了UpdatePanel()作为属性来解决需要在jQuery中使用__doPostBack()
调用的问题,我可以从click事件处理程序中的父页面轻松访问它。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Controls_TestControl : System.Web.UI.UserControl
{
public UpdatePanel UpdatePanel() { return UpdatePanel1; }
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Label1.Text = DateTime.Now.Ticks.ToString();
}
}
}
<强> Test.aspx文件:强>
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" %>
<%@ Register TagPrefix="uc" TagName="TestControl" Src="~/Controls/TestControl.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Fire UpdatePanel1" />
<asp:Label ID="Label1" runat="server" Text="Val"></asp:Label>
<br /><br />
<uc:TestControl ID="TestControl1" runat="server" />
<br />
<uc:TestControl ID="TestControl2" runat="server" />
</form>
</body>
</html>
<强> Test.aspx.cs:强>
注意:我在Button1
注册了Page_Load
,ScriptManager1.RegisterAsyncPostBackControl(Button1);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager1.RegisterAsyncPostBackControl(Button1);
if (!IsPostBack)
{
Label1.Text = DateTime.Now.Ticks.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
TestControl1.UpdatePanel().Update();
}
}