asp.net - 动态创建的下拉列表,不在回发中调用事件处理程序方法

时间:2012-04-10 23:43:19

标签: asp.net dynamic drop-down-menu

我有一个页面来进行层次搜索,它从下拉列表开始,根据下拉列表中选择的值,它将查询数据库并在另一个下拉列表中显示子项,只要它到达叶子就会继续...所以我首先动态添加下拉列表并且它在SelectedIndexChanged上有事件处理程序,当我更改所选值时,它会触发回发但是不会调用事件处理程序方法 ..不确定是什么我在这里做错了..还是一个错误?

使用会话变量来跟踪创建的控件

private List<DynamicControlProperties> PersistedControls 
    {
        get
        {
            if (_persistedControls == null)
            {
                if (Session[PersistedControlsKey] == null)
                {
                    Session[PersistedControlsKey] = new List<DynamicControlProperties>();
                }

                _persistedControls = Session[PersistedControlsKey] as List<DynamicControlProperties>;
            }

            return _persistedControls;
        }
    }

在Page Init中,重新创建动态生成的控件

protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);

        // regenerate the persisted controls
        foreach (var prop in PersistedControls)
        {
            CreateControl(prop);
        }

    }

在页面加载中,创建了第一个下拉列表

protected void Page_Load(object sender, EventArgs e)
    {


        if (!Page.IsPostBack)
        {
           // create the control
            CreateControl(....)

           // bind the data to the dropdown
         }
   }

在创建控制方法中,只需创建一个标签和一个下拉列表将其包装在一个并将其添加到占位符

private DropDownList CreateControl(DynamicControlProperties dynamiccntrlprop)
    {
        // create a new HTML row
        HtmlGenericControlWithParentID tr = new HtmlGenericControlWithParentID("tr");
        HtmlGenericControlWithParentID td1 = new HtmlGenericControlWithParentID("td");
        HtmlGenericControlWithParentID td2 = new HtmlGenericControlWithParentID("td");

        // make sure we set the id and parentid
        tr.ID = string.Format("tr{0}", dynamiccntrlprop.ID);            
        tr.ParentID = dynamiccntrlprop.ParentID;
        tr.EnableViewState = true;

        // create a new label for dropdown
        Label lbl = new Label() { ID = string.Format("lbl{0}", dynamiccntrlprop.DisplayName), Text = dynamiccntrlprop.DisplayName };

        // create a new dropdown list
        DropDownList ddl = new DropDownList()
        {
            ID = string.Format("ddl{0}", dynamiccntrlprop.DisplayName),

            // set the postback
            AutoPostBack = true,

            EnableViewState = true
        };

        // subscribe for the select index changed event
        ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);

        // add the controls to table row
        td1.Controls.Add(lbl);
        td2.Controls.Add(ddl);

        tr.Controls.Add(td1);
        tr.Controls.Add(td2);

        // add the control to place holder     
        this.filtersPlaceHolder.Controls.Add(tr);

        return ddl;

    }

这是索引更改的处理程序,

protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
}

启用了viewstate,autopostback blah blah blah ...在帖子中重新创建了具有相同id的控件..尝试了谷歌中的所有答案..但没有运气..当我更改索引但它没有触发回发调用事件处理程序方法..

任何想法,请???

非常感谢, ķ

2 个答案:

答案 0 :(得分:1)

您必须确保在每个页面回发上调用CreateControl方法。这需要确保在回发后连接动态控件的事件处理程序。

protected void Page_Load(object sender, EventArgs e)
{
    // you shouldn't wrap the call to CreateControl in this 'if' statement
    //if (!Page.IsPostBack)
    //{
           // create the control
            CreateControl(....)

           // bind the data to the dropdown
    //}
}

执行此操作后,将触发所选索引已更改事件。

答案 1 :(得分:0)

也许这是因为没有加载下拉列表的新价值。     protected override void LoadViewState(object savedState)     {

    // regenerate the persisted controls
    foreach (var prop in PersistedControls)
    {
        CreateControl(prop);
    }

    base.LoadViewState(savedState);
}