2

所以,我有一个带有更新面板的用户控件。我还在我的控件上放了一个用于更新面板的按钮。我在一个页面中包含此控件 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>

网络表格.vb

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            Label1.Text = DateTime.Now.Ticks.ToString();
    }
4

1 回答 1

1

编辑工作解决方案:

错误是:您Button1在 UpdatePanels 之外,因此发回您的页面和所有控件。因此,它们都被更新了。您不能在Triggers控件的部分中添加按钮,因为显然控件不知道它。所以你要做的就是将该按钮注册为一个异步回发控件。这是我所做的:

测试控制.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>

测试控制.ascx.cs:

注意:我添加了 UpdatePanel() 作为一个属性来绕过需要__doPostBack()在 jQuery 中使用您的调用,并且我可以轻松地从 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();
        }
    }
}

测试.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>

测试.aspx.cs:

注意:这是我Button1Page_Loadwith中注册的地方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();
    }

}
于 2012-04-05T13:10:41.270 回答