asp.net多个updatepanel用户控件

时间:2012-04-05 12:50:17

标签: asp.net updatepanel

所以,我有一个带有更新面板的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>
    &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 个答案:

答案 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_LoadScriptManager1.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();
    }

}