.ASP DropDownList在使用动态DataSource的第一次回发时无法正常工作

时间:2011-02-25 16:04:51

标签: c# asp.net drop-down-menu

这是问题 - 面板内有DropDownList。 DropDownList.DataSorce预先填入Load_Page方法(C#)。 AutoPostBack已启用。 ViewState也已启用。问题没有出现在第一个面板的第一个下拉列表中。 问题在于 - 在选择值后,值被改变,但是dropdownlist已经忘记了它的所有参数(值,数据源等)。再点击下拉列表中的一次,现在它可以正常工作。

因此 - 只有在选择了第一个时间值后,下拉列表才能正常工作。

1)选择值

2)一个(selectedindex = 0)

3)选择值(值丢失)

4)一个(selectedindex是正确的)

我找到了使用Request.Form [dropdown.UniqueId]的丑陋解决方法来手动获取所选值并在第二次设置DataSource后恢复它,但这是一个糟糕的解决方案并且看起来很难看。

我在这个问题上花费了8 + h,这让我变得疯狂!

PS此错误仅在2+面板上发生。第一个pannel的控件按预期工作!

这里有一些代码 -

Page_Load看起来像这样

if (ViewState["dropdownset"] == null) // tried many other thing here as well...
{
   dropdown.DataSource = new dictionary<string, string>();
   dropDown.EnableViewState = true;
   ... fill in some data in datasource
   dropdown.SelectedValue = "0"; //some key from dictionary (verified to work)
   dropdown.BindData();
   ViewState["dropdownset"] = true;
}
像这样。正如我所说 - 没有任何魔法!它不会起作用。这不是常规问题,因为我在这个上花了8小时,而且我在程序员中表现最好! ;)

3 个答案:

答案 0 :(得分:0)

如果启用了ViewState,则无需手动重置。

你的Page_Load应该是这样的:

protected void Page_Load() {

 if(!Page.IsPostBack) {
      dropdown.DataSource = //whatever your datasource is
      dropdown.DataBind();
 }

}

答案 1 :(得分:0)

您仍然需要在每个页面加载时设置DataSource,而不是在DataBind上设置。

关于你对杰克马尔凯蒂答案的评论 - 我不明白你发布的代码如何适应“添加新面板”。您是否动态创建面板和/或下拉控件?

答案 2 :(得分:0)

我有同样的问题。 我有一个DropDownListBox并将EnableViewState设置为false。 在每个回发中,我需要从数据库中的表重新填充列表框。 但是,第一次选择列表框中的项目时,会触发SelectedIndexChanged事件,但SelectedItem.Value为“0”。但是,第二次选择列表框中的项目时,SelectedItem.Value是正确的。 我的解决方案是使用SqlDataAdapter。