0

これが私が設定した構造です:

<UserControl1>
    <ListView>
        <UserControl2 />
        <UserControl2 />
        <UserControl2 />
        <UserControl2 />
    </ListView>
</UserControl2>

ユーザーがUserControl2で[編集]をクリックすると、UserControl1でそのイベントを処理したいと思います。そこで、UserControl2でイベントを作成し、ListView DataBindのUserControl1にハンドラーを追加し、[編集]をクリックしてUserControl2イベントを発生させました。

しかし、ユーザーが[編集]をクリックすると、すべてがポストバックされ、UserControl1でハンドラーが失われます。問題は、ハンドラーを再追加するのは非常に重くて時間のかかる操作であるため、すべてのポストバックでそのListViewを再バインドできないことです。

では、どうすればUserControl1にUserControl2のイベントを表示させることができますか?

私が試したこと:

  1. Usercontrol2の静的/共有イベント...asp.netアプリでは悪い考えです。明らかに、これらの静的イベントは何らかの形で混同され、さまざまなWebリクエストに存在すると思います。
  2. userControl1インスタンスプロパティ(ParentControl1)をUserControl2に追加しています...ネストされたUserControlsはasp.netでは許可されていません。

ご協力いただきありがとうございます。

4

1 に答える 1

2

私はしばらくの間Webフォームを作成していませんが、これに興味がありました。

これらの3つのファイルは、ユーザーコントロールを使用してイベントをサブスクライブする方法を示しています。

  • 基本的に、私のUserControl1には、サブスクライブできるイベントがあります。
  • UserControl2には、UserControl1のインスタンスを含むListViewがあります。UserControl2にいる間、UserControl1のインスタンスでイベントをサブスクライブできます。
  • Default.aspxには、UserControl2のインスタンスが含まれています

UserControl1のイベントのいずれかをクリックすると、イベントが発生します。この場合は、UserControl1にあるボタンのテキストを送信するだけです。

VBのコードはかなり似ているはずです。

UserControl1

<%@ Control Language="C#" AutoEventWireup="true" %>
<script runat="server">
    public delegate void SillyHandler(object sender, string text);
    public event SillyHandler SomethingHappened;

    public string Name { get; set; }

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (SomethingHappened != null)
            SomethingHappened(this.Button1, this.Button1.Text);
    }
</script>
<asp:Button ID="Button1" runat="server" Text="<%#this.Name %>" onclick="Button1_Click" />

UserControl2

<%@ Control Language="C#" AutoEventWireup="true" %>
<%@ Register src="UserControl1.ascx" tagname="UserControl1" tagprefix="uc1" %>
<script runat="server">
    public List<string> DataSource { get; set; }


    protected void SomethingHappened(object sender, string txt)
    {
        MyLabel.Text = txt;
    }
</script>
<asp:ListView runat="server" ID="ListView1" DataSource="<%#DataSource %>">
    <ItemTemplate>
        <uc1:UserControl1 ID="UserControl11"  runat="server" OnSomethingHappened="SomethingHappened" Name="<%#Container.DataItem %>"/>
    </ItemTemplate>
</asp:ListView>

<asp:Label runat="server" ID="MyLabel" />

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" %>

<%@ Register src="UserControl2.ascx" tagname="UserControl2" tagprefix="uc1" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.UserControl21.DataSource = new List<string> { "A", "B", "C" };
            this.UserControl21.DataBind();
        }
    }
</script>

<!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">
    <div>

        <uc1:UserControl2 ID="UserControl21" runat="server" />

    </div>
    </form>
</body>
</html>
于 2012-09-07T22:40:45.990 に答える