0

メインページビューには、リンクボタンとプレースホルダーがあり、ユーザーコントロールを登録します。

<%@ Register TagPrefix="vf" TagName="Headline" Src="~/Controls/Headline.ascx" %>

<asp:LinkButton ID="lbAddHeadline" runat="server" OnClick="lbAddHeadline_OnClick">+ Headline</asp:LinkButton>

<asp:PlaceHolder ID="phAddTemplateControlsArea" runat="server"></asp:PlaceHolder>

このリンクボタンの場合、ページに追加したコントロールの数に基づいてコントロールにIDを付け、コマンドargを設定してボタンクリックイベントをリンクし、それらすべてをパネルにロードします。ユーザーコントロールのボタンをクリックすると、メインページのメソッドRemoveItem_OnClick()を起動するようにします。

protected void lbAddHeadline_OnClick(object sender, EventArgs e)
{
    Controls_Headline ctrl = (Controls_Headline)LoadControl("~/Controls/Headline.ascx");
    ctrl.ID = "MyCtrl_" + CMSSession.Current.AddedTemplateControls.Count;
    ctrl.Remove.CommandArgument = CMSSession.Current.AddedTemplateControls.Count.ToString();
    ctrl.RemoveEvent += new EventHandler(RemoveItem_OnClick);

    CMSSession.Current.AddedTemplateControls.Add((Control)ctrl);

    LoadControlsToPanel();
}

private void LoadControlsToPanel()
{
    PlaceHolder ph = accAddTemplates.FindControl("phAddTemplateControlsArea") as PlaceHolder;

    foreach (var ctrl in CMSSession.Current.AddedTemplateControls)
    {
        ph.Controls.Add(ctrl);
    }
}

public void RemoveItem_OnClick(object sender, EventArgs e)
{
    LinkButton lb = sender as LinkButton;
}

コントロールがメインページのパネルに追加されると、OnInitメソッドをオーバーライドして、ユーザーコントロールのデータを保持します。

protected override void OnInit(EventArgs e)
{
    PlaceHolder ph = accAddTemplates.FindControl("phAddTemplateControlsArea") as PlaceHolder;

    int counter = 0;

    foreach (UserControl ctrl in CMSSession.Current.AddedTemplateControls)
    {
        ctrl.ID = "MyCtrl_" + counter;
        ITemplateControl ictrl = ctrl as ITemplateControl;
        ictrl.Remove.CommandArgument = counter.ToString();
        ictrl.RemoveEvent += new EventHandler(RemoveItem_OnClick);
        counter++;
        ph.Controls.Add(ctrl);
    }

    base.OnInit(e);
}

ご覧のとおり、usercontrolはそれが使用する共通のインターフェースを意味し、他のusercontrolが使用するので、いくつかの共通のボタンをリンクできます

public interface ITemplateControl
{
    LinkButton Remove { get; set; }
    TextBox Label { get; set; }
    event EventHandler RemoveEvent;
}

これは、ユーザーコントロールのhtmlです。

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Headline.ascx.cs" Inherits="Controls_Headline" %>

<div class="headline">

    Headline Text:

    <asp:TextBox ID="txtLabel" runat="server"></asp:TextBox>

    <asp:LinkButton ID="lbRemove" runat="server" OnClick="lbRemove_OnClick">X</asp:LinkButton>

</div>

これは、ユーザーコントロールの背後にあるコードです。

public partial class Controls_Headline : UserControl, ITemplateControl
{    
    protected void Page_Load(object sender, EventArgs e)
    {
        lbRemove.Click += new EventHandler(lbRemove_OnClick);
    }

    public TextBox Label
    {
        get { return txtLabel; }
        set { txtLabel = value; }
    }

    public LinkButton Remove
    {
        get { return lbRemove; }
        set { lbRemove = value; }
    }

    public event EventHandler RemoveEvent;

    protected void lbRemove_OnClick(object sender, EventArgs e)
    {
        if (RemoveEvent != null)
        {
            RemoveEvent(sender, e);
        }
    }
}

ここで、usercontrol内にあるlbRemoveリンクボタンをクリックすると、それ自体のメソッドlbRemove_OnClickを呼び出してから、OnInitメソッドでバインドしたデリゲートイベントを呼び出すことを期待しています。

lbRemoveリンクボタンをクリックするたびに、メインページのOnInitメソッドが呼び出されます。

私は何が欠けていますか?

4

1 に答える 1

1

理解した。

クリックイベントをUCからページのクリックイベントに直接バインドするだけです。私はそれを複雑にしすぎていました。

    protected void lbAddHeadline_OnClick(object sender, EventArgs e)
    {
        Controls_Headline ctrl = (Controls_Headline)LoadControl("~/Controls/Headline.ascx");
        ctrl.ID = "MyCtrl_" + CMSSession.Current.AddedTemplateControls.Count;
        ctrl.Remove.CommandArgument = CMSSession.Current.AddedTemplateControls.Count.ToString();
        ctrl.Remove.Click += new EventHandler(RemoveItem_OnClick);

        CMSSession.Current.AddedTemplateControls.Add((Control)ctrl);

        LoadControlsToPanel();
    }

    protected override void OnInit(EventArgs e)
    {
        PlaceHolder ph = accAddTemplates.FindControl("phAddTemplateControlsArea") as PlaceHolder;

        int counter = 0;

        foreach (UserControl ctrl in CMSSession.Current.AddedTemplateControls)
        {
            ctrl.ID = "MyCtrl_" + counter;
            ITemplateControl ictrl = ctrl as ITemplateControl;
            ictrl.Remove.CommandArgument = counter.ToString();
            ictrl.Remove.Click += new EventHandler(RemoveItem_OnClick);
            counter++;
            ph.Controls.Add(ctrl);
        }

        base.OnInit(e);
    }
于 2013-01-24T18:53:37.837 に答える