[英]LinkButton click event not firing in dynamic usercontrol
在我的主页视图上,我有一个链接按钮,一个占位符,并注册了用户控件:
<%@ 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方法以将数据保留在usercontrol中:
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);
}
如您所见,用户控件隐含了一个通用接口,其他用户控件将使用该接口,因此我可以链接一些通用按钮
public interface ITemplateControl
{
LinkButton Remove { get; set; }
TextBox Label { get; set; }
event EventHandler RemoveEvent;
}
这是usercontrol的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);
}
}
}
现在,当我单击用户控件中的lbRemove链接按钮时,我希望它调用它自己的方法lbRemove_OnClick,然后在OnInit方法中调用绑定到的委托事件。
每次我单击lbRemove链接按钮时,会发生什么事,它调用了主页的OnInit方法,仅此而已。
我想念什么?
弄清楚了。
只需将UC的click事件直接绑定到页面中的click事件即可。 我太复杂了。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.