删除动态用户控件

时间:2011-09-11 09:27:46

标签: c# asp.net dynamic webusercontrol

我有一个动态加载用户控件的网页。每个用户控件都可以递归地在其自身内加载相同的控件。每个控件都有一个删除按钮。我遇到的问题是当用户点击删除按钮时,我需要删除包含删除按钮的控件。

页面控件集合可能如下所示:

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

2 个答案:

答案 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”指的是控件(在我的情况下是工具栏),第一个父项是插入工具栏的占位符,第二个父项是我动态添加到页面的实际模块。 Intellisense

如果我第三次打电话给父母,它将升级到包含动态控件的容器。