鉴于以下内容
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中,还是我期望太多?
答案 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不会受到影响,您将获得理想的结果!