一个 CompositeControl 中的 DropDownList 是否应该记住选定项?

4

鉴于以下情况

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个回答

2

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


-1

这里是最佳推荐的解决方案。它在于正确理解页面生命周期!像下拉列表这样的Postback控件会恢复其已发布状态(下拉列表的选定项已发布)。它忘记了它的选定值,因为您在Page_Load事件中重新绑定它,而此时下拉列表已经加载了已发布的值(因为View State是在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事件之前加载控件的视图状态,因此DropDownList的selectedIndex不会受到影响,您将神奇地获得所需的结果!


1
我们在这里谈论的是CompositeControl,而不是ASP.NET页面。请参阅http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.compositecontrol(v=VS.90).aspx。 - tomfanning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接