2

だから、私は更新パネルを備えたユーザーコントロールを持っています。また、コントロールのパネルを更新するためのボタンを配置しました。このコントロールを1ページに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();
    }
4

1 に答える 1

1

実用的なソリューションのための編集:

エラーの内容は次のとおりです。あなたButton1はUpdatePanelsの外にいるため、ページとそれを含むすべてのコントロールをポストバックします。したがって、両方とも更新されます。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:

注:__doPostBack()jQueryで呼び出しを使用する必要性を回避するために、プロパティとしてUpdatePanel()を追加しました。これには、クリックイベントハンドラーの親ページから簡単にアクセスできます。

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

}
于 2012-04-05T13:10:41.270 に答える