ASP.NET DropDownList错误 - SelectedItem / Value永远不会更新

时间:2012-02-10 13:52:21

标签: c# asp.net .net

编辑:解决了。尝试将DataTable绑定到DDL时偶然发生了两次,而没有检查页面的PostBack状态。一旦删除了多余的绑定尝试,问题便消失了。感谢大家的帮助。

我有一个aspx页面,其背后的一些代码是按字母顺序排列的下拉列表(ddlLocationState)或US状态。但无论选择哪个项目,如果我执行ddlLocationState.SelectedItem / Value / Index,它总是“Alaska”和“0”。每一次。甚至在SelectedIndexChange事件处理程序中。

这是在aspx页面中声明DDL的地方(这是页面中唯一的引用):

<tr>
   <td>&nbsp;</td>
   <td class="textBlue"><label>State: </label></td>
   <td>
      <asp:DropDownList runat="server" ID="ddlLocationState" style="width: 250px;"/>
   </td>
</tr>

以下是设置DDL内容的代码: private void BindStates()

  private void BindDDL()
  {
     //Get all state info:
     // Populate a DataTable called "sdt" with two columns, name (a state)
     // and "id" (a number from 0 to 49)

     //Bind the DataTable "sdt":
     this.ddlLocationState.DataSource = sdt;
     this.ddlLocationState.DataTextField = "name";
     this.ddlLocationState.DataValueField = "id";
     this.ddlLocationState.DataBind();
  }

这里有一些代码隐藏尝试获取当前选择的值:

private void ddlLocationState_SelectedIndexChanged(object sender, EventArgs e)
{
   System.Diagnostics.Debug.WriteLine("on index changed:   " +  dlLocationState.SelectedItem.Value.ToString());
}

这是调用BindDDL的地方:

protected void Page_Load(object sender, EventArgs e)
      {
         this.pnlLocationMaintenance.Visible = false;
         this.LocationSortDirection = "asc";
         this.LocationSortField = "address";
         this.BindStates();
         this.dgLocations.CurrentPageIndex = 0;
         this.BindLocations();

         if (!Page.IsPostBack)
         {
            BindDDL();
         }
         ddlLocationState.SelectedIndexChanged += new EventHandler(ddlLocationState_SelectedIndexChanged);
      }

为什么ddlLocationState.SelectedItem / Value / Index 总是相同,即使在选定的索引更改事件处理程序中也是如此?

3 个答案:

答案 0 :(得分:2)

如果您在page_load上进行数据绑定而不检查是否处于回发状态,则会发生这种情况。根据您描述的症状,我的假设是这就是正在发生的事情。

在您的PageLoad(...)方法中,您需要: if(!Page.IsPostBack) {     BindDDL(); }

答案 1 :(得分:2)

向我们展示您调用BindDDl()的代码。我的猜测是你即使在回发时也在调用BindDDl(),所以它会重新填充列表并清除你的选择。

答案 2 :(得分:2)

您是否在page_load事件中调用BindDDL()方法?如果是这样,你应该检查请求是否不是回复