遇到个有难度的PlaceHolder生成控件和控件事件的问题,求助高手,帮顶有分!

时间:2022-07-01 05:06:29
有一个商品大类(他的下面是无限分级的类别)的DropDownList,选择项变时触动PageIndexChanged事件,运行函数CreateCategoryControls,该函数在phCategorys(PlaceHolder)中Add一个绑定子类别的DropDownLIst,并且为其附加事件ddlRootClass_SelectedIndexChanged,当这个生成的DropDownList选择项变时, 触动ddlRootClass_SelectedIndexChanged,继续生成下级分类的DropDownList....如此递归...

大致代码如下:


protected void ddlRootClass_SelectedIndexChanged(object sender, EventArgs e)
        {
            CreateCategoryControls(((DropDownList)sender).SelectedValue);
        }

private void CreateCategoryControls(string rootId)
        {            
            IList<Category> categorys = new List<Category>();

            CategoryManager categoryManager = new CategoryManager();
            categorys = categoryManager.GetCategoryChildrenByRoodId(rootId);

            if (categorys.Count <= 0)
                return;     
            
            DropDownList ddl = new DropDownList();
            ddl.ID = "ddlChlidClass" + rootId;
            ddl.DataTextField = "categoryName";
            ddl.DataValueField = "id";
            ddl.DataSource = categorys;
            ddl.DataBind();
            ddl.AutoPostBack = true;
            ddl.SelectedIndexChanged += new EventHandler(ddlRootClass_SelectedIndexChanged); 
            this.phCategorys.Controls.Add(ddl);
        }



遇到的问题是生成的控件在选择项变时,即AutoPostBack 时,控件不在存在, 因为PlaceHolder生成的控件无法保持在下一次Page_Load事件来临之前,通常的做法是在override void OnInit(EventArgs e)里再创建,以保持该控件有效性,但是,我的控件是在事件中生成的,有没有办法让他在postback后继续保持有效性呢?或者有没有其他办法实现这个功能?甚至不用创建控件的方法?

12 个解决方案

#1


用JS在客户端做

#2


js做应该可以,可能会很麻烦。

#3


PlaceHolder本身不能保存ViewState

可以参考
http://www.cnblogs.com/mail-ricklee/archive/2008/03/06/1093260.html
中NickLee.Web.UI.dll


NickLee:DynamicControlsPlaceholder

#4


有一个第三方的placeholder可以
搜索 Debauer Placeholder

#5


用javascript是个很不错的选择!

#6


加个  if(!Page.IsPostBack)
       { 
        ...............
        }

#7


用js怎么做呢?有几层是不确定的啊,js能生成控件吗?

#8


up

#9


各位帮帮忙啊! 
真的不行的话,我就改用treeview。。。虽然用treeview选择分类有点恶心。。。

#10


js,别的都不太靠普

#11


引用 10 楼 lythappy 的回复:
js,别的都不太靠普

JS要怎么做啊?拜托帮写一下示例

#12


还是没有人帮忙吗??

#1


用JS在客户端做

#2


js做应该可以,可能会很麻烦。

#3


PlaceHolder本身不能保存ViewState

可以参考
http://www.cnblogs.com/mail-ricklee/archive/2008/03/06/1093260.html
中NickLee.Web.UI.dll


NickLee:DynamicControlsPlaceholder

#4


有一个第三方的placeholder可以
搜索 Debauer Placeholder

#5


用javascript是个很不错的选择!

#6


加个  if(!Page.IsPostBack)
       { 
        ...............
        }

#7


用js怎么做呢?有几层是不确定的啊,js能生成控件吗?

#8


up

#9


各位帮帮忙啊! 
真的不行的话,我就改用treeview。。。虽然用treeview选择分类有点恶心。。。

#10


js,别的都不太靠普

#11


引用 10 楼 lythappy 的回复:
js,别的都不太靠普

JS要怎么做啊?拜托帮写一下示例

#12


还是没有人帮忙吗??