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 中,还是我期待太多?

4

2 回答 2

2

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

于 2010-07-30T15:51:55.670 回答
-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不会受到影响,你会神奇的得到想要的结果!!

于 2011-03-23T00:17:27.763 回答