CompositeControl中的DropDownList是否应该记住所选项目?

时间:2010-07-06 10:41:41

标签: asp.net data-binding drop-down-menu composite-controls

鉴于以下内容

public class MyControl : CompositeControl
{
    private DropDownList myList;

    protected override void CreateChildControls()
    {
        base.CreateChildControls();

        myList = new DropDownList();
        myList.AutoPostBack = true;
        this.Controls.Add(myList);
        if (!Page.IsPostBack)
        {
            myList.DataSource = MyBLL.SomeCollectionOfItems;
            myList.DataBind();
        }
    }
}

我发现列表中的项目仍然存在,但是当呈现不同的控件然后再次渲染时,最后选择的项目不会保留。 (总是选择列表中的第一项)

最后选择的项目是自动保留在ViewState中,还是我期望太多?

2 个答案:

答案 0 :(得分:2)

我认为这是一个隐藏的ViewState问题。您在CreateChildControls中创建并绑定控件。您应该只在这个地方创建控件。将绑定代码移动到类加载事件并使用EnsureChildControls。

答案 1 :(得分:-1)

以下是最佳推荐的解决方案。 正确理解页面生命周期!! 回滚控制如下拉列表恢复其发布状态(发布下拉列表的选定项目)。它忘记了它的选定值,因为你在Page_Load事件中重新绑定它,这是在下拉列表加载了发布值之后(因为在Page_Init事件之后和Page_Load事件之前加载了视图状态)。在Page_Load事件中的重新绑定中,下拉列表会忘记其还原的所选项目。最好的解决方案是在Page_Init事件中执行数据绑定,而不是Page_Load事件。

做类似下面的事情......

假设下拉列表名称为lstStates。

protected void Page_Init(object sender, EventArgs e) 
{   
   lstStates.DataSource = QueryDatabase(); //Just an example.  
   lstStates.DataTextField = "StateName";       
   lstStates.DataValueField = "StateCode";    
   lstStates.DataBind(); 
}

ASP.NET在Page_Init事件之后和Page_Load事件之前加载控件的View State,因此Drop Down List的selectedIndex不会受到影响,您将获得理想的结果!