2012-04-05 50 views
2

所以,我有一個用戶控件更新面板。 我也放了一個按鈕來更新我的控制面板。 我在頁面中包含這個控件2次(或更多)。 我只想更新其中的一個,但是當我使用按鈕時,兩個面板都會更新。asp.net多個updatepanel usercontrol

控制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> 
    &nbsp; 
    <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(); 
    } 

回答

1

編輯工作的解決方案:

這裏的錯誤是什麼:你Button1是UpdatePanel的外面,從而回發您的網頁和所有與它的控制。因此它們都被更新。您無法在控件的Triggers部分添加按鈕,因爲控件顯然不知道它。所以你必須做的是將該按鈕註冊爲異步回發控制。下面是我所做的:

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()電話,我可以很容易地從訪問此單擊事件處理程序中的父頁面。

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:

注:這裏是我在Page_Load註冊Button1ScriptManager1.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(); 
    } 

} 
+0

我已經試過,但他仍然改變控制 – forX 2012-04-05 13:41:24

+0

你是否查看過源代碼,看看兩個UpdatePanels的ID是真的? – 2012-04-05 13:55:14

+0

我不確定你的意思? – forX 2012-04-05 14:05:38