2012-04-05 3 views
2

Итак, у меня есть usercontrol с панелью обновления. Я также поставил кнопку для обновления панели на моем элементе управления. Я включаю этот элемент управления 2 раза (или больше) на страницу. Я хочу обновить только один из них, но когда я использую кнопку, обе панели обновляются.asp.net multiple 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

EDIT ДЛЯ РАБОЧЕГО РАСТВОРА:

Вот что ошибка: Ваш Button1 находится вне UpdatePanels, таким образом, размещение обратно на страницу и все элементы управления с ним. Следовательно, оба они обновляются. Вы не можете добавить кнопку в разделе Triggers вашего контроля, потому что, очевидно, элемент управления не знает об этом. Итак, что вам нужно сделать, это зарегистрировать эту кнопку в качестве асинхронного PostBack Control. Вот что я сделал:

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() как свойство, чтобы обойти необходимости использовать ваши __doPostBack() звонки в JQuery, и я могу легко получить доступ к этому от родительской страницы в обработчике событий клика.

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(); 
    } 

} 
+0

Я уже пытаюсь, но он все равно меняет оба элемента управления – forX

+0

Вы просматривали источник, чтобы узнать, что на самом деле есть идентификаторы обоих обновлений? –

+0

Я не уверен, что у вас значит? – forX

Смежные вопросы