【问题标题】:Should a DropDownList within a CompositeControl remember selected item?CompositeControl 中的 DropDownList 是否应该记住选定的项目?
【发布时间】:2011-03-12 06:13:12
【问题描述】:

鉴于以下

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这是最值得推荐的解决方案。 关键在于正确理解页面生命周期!! 下拉列表等回发控件恢复其发布状态(发布的下拉列表的选定项)。它忘记了它的选定值,因为您在 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不会受到影响,你会神奇的得到想要的结果!!

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多