我有一个动态加载用户控件的网页。每个用户控件都可以递归地在其自身内加载相同的控件。每个控件都有一个删除按钮。我遇到的问题是当用户点击删除按钮时,我需要删除包含删除按钮的控件。
页面控件集合可能如下所示:
Page
Group 1
Category Control
Category Control
Category Control
Category Control
Category Control
Category Control
如何删除新创建的类别控件。我试过这个。但是它不起作用。
在添加时动态加载用户控件的主页面上:
protected void cmdsubmitsofficecat_Click(object sender, EventArgs e)
{
int retvalue = 0;
SQLConnectivity db = new SQLConnectivity();
SqlParameter[] param = new SqlParameter[8];
List<group.category> flist = new List<group.category>();
param[0] = db.MakeInputParameter("@group_id", 1);
param[1] = db.MakeInputParameter("@parent_id", DBNull.Value);
param[2] = db.MakeInputParameter("@category_name", this.txtofficecat.Text.Trim());
param[3] = db.MakeInputParameter("@description", this.txtofficecat.Text.Trim());
param[4] = db.MakeInputParameter("@organization_id", 1);
param[5] = db.MakeInputParameter("@created_by", 1);
param[6] = db.MakeInputParameter("@is_active", 1);
param[7] = db.MakeOutputIntegerParameter("@category_id");
db.RunNonQueryProcedure("PerformanceCategorySave", param, ref retvalue);
if (retvalue != 0)
{
group.category item = new group.category();
item.catid = retvalue;
item.catname = this.txtofficecat.Text.Trim();
item.desc = this.txtofficecat.Text.Trim();
item.isactive = true;
item.parid = 0;
catctl ctl = (catctl)Page.LoadControl("~/catctl.ascx");
ctl.groupid = 1;
ctl.organizationid = 1;
ctl.categoryid = item.catid;
ctl.categoryname = item.catname;
ctl.parentid = item.parid;
ctl.ctltype = 1;
ctl.clist = item.categories;
ctl.plist = item.points;
this.officephld.Controls.Add(ctl);
this.switch_officefields(false, 1);
}
}
在Web用户控件上,我有一个Page_Load方法:
protected void Page_Load(object sender, EventArgs e)
{
Label ctname = (Label)this.FindControl("ctl0_catname");
this.catname.Text = categoryname;
this.cmdaddcat.Attributes.Add("catid", categoryid.ToString());
this.cmddeletecat.ID = "cmddeletecat" + categoryid.ToString();
this.cmddeletecat.Click += new ImageClickEventHandler(this.cmddeletecat_Click);
if ( clist != null && clist.Count > 0 )
{
int i = 0;
this.cmddeletecat.Visible = false;
foreach ( group.category item in clist )
{
catctl ctl = (catctl)Page.LoadControl("~/catctl.ascx");
ctl.categoryid = item.catid;
ctl.categoryname = item.catname;
ctl.organizationid = organizationid;
ctl.groupid = groupid;
ctl.parentid = item.parid;
ctl.clist = item.categories;
ctl.plist = item.points;
ctl.ctltype = ctltype;
this.newphld.Controls.Add(ctl);
}
}
if ( plist != null && plist.Count > 0 )
{
this.rptPts.Visible = true;
this.rptPts.DataSource = plist;
this.rptPts.DataBind();
this.cmddeletecat.Visible = false;
}
this.Switch_Usability();
}
和删除方法:
protected void cmddeletecat_Click(object sender, ImageClickEventArgs e)
{
List<group.category> flist = new List<group.category>();
SQLConnectivity db = new SQLConnectivity();
SqlParameter[] param = new SqlParameter[1];
DataTable dt = new DataTable();
DataTable sdt = new DataTable();
group parent = new group();
param[0] = db.MakeInputParameter("@category_id", categoryid);
db.RunNonQueryProcedure("PerformanceCategoryDelete", param);
if ( Page != null )
{
PlaceHolder ctl = (PlaceHolder)Page.FindControl("officephld");
if ( ctl != null )
{ ctl.Controls.Remove(this); }
}
}
答案 0 :(得分:2)
您可以使用newlyCreatedControl.Parent.Controls.Remove(newlyCreatedControl)
方法删除此newCreatedControl。
答案 1 :(得分:0)
如果删除按钮直接位于控件内,“this”将引用该控件,您可以使用父控件来获取控件容器。
this.Parent.Controls.Remove(this)
如果删除按钮位于控件内的占位符或其他容器控件内,则必须使用Parent两次:
this.Parent.Parent.Controls.Remove(this)
如果您将此代码放在删除点击事件中并将鼠标悬停在“this”关键字上,Intellisense应该会向您显示这是指您的控件类。
例如,我的动态控件有一个占位符,我注入了一个工具栏控件。所以为了到达实际的模块,我必须使用Parent.Parent(见下图,当我将鼠标悬停在它上面时,它显示了Intellisense)。 “this”指的是控件(在我的情况下是工具栏),第一个父项是插入工具栏的占位符,第二个父项是我动态添加到页面的实际模块。
如果我第三次打电话给父母,它将升级到包含动态控件的容器。