【问题标题】:Asp.NET DropDownList Resets SelectedIndex after PostBackAsp.NET DropDownList 在 PostBack 后重置 SelectedIndex
【发布时间】:2011-08-05 02:11:44
【问题描述】:

在网上做了很多研究之后,我仍然被这个问题难住了。我有一个页面,将类​​别的名称和计数加载到下拉列表中。我只在!(Page.IsPostBack) 时这样做。当AutoPostBack 触发SelectedIndex = 0。我尝试了几种不同的方法。这是我的代码:

页面

<form id="AddAssignmentForm" runat="server">
<asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="true" runat="server" />

<asp:UpdatePanel ID="CommentUpdate" runat="server">
<ContentTemplate>

Add Comment
<asp:DropDownList ID="ddlCategory" runat="server" Width="206" OnSelectedIndexChanged="ddlCategory_SelectedIndexChanged" AutoPostBack="true" />
<asp:TextBox ID="txtName" runat="server" Width="200" />
<asp:TextBox ID="txtAbbrv" runat="server" Width="200" />
<asp:TextBox ID="txtDescription" runat="server" Width="200" Height="90" TextMode="MultiLine" />

</ContentTemplate>
</asp:UpdatePanel>
</form>

这是后端代码。

private void Page_Load(object sender, System.EventArgs e)
{
    if (!Page.IsPostBack)
    {
        GetCategories();
    }
}

public void GetCategories()
{
    String strSql = @"SELECT Name, Total
                        FROM MyTable";

    if (con.State == ConnectionState.Closed)
        con.Open();

    OleDbCommand cmdsql = new OleDbCommand(strSql, con);
    OleDbDataReader cmdReader = cmdsql.ExecuteReader();

    if (cmdReader.HasRows)
    {
        while (cmdReader.Read())
        {
            ddlCategory.Items.Add(new ListItem(cmdReader["Category_Name"].ToString(), cmdReader["Total"].ToString()));

        }
        ddlCategory.SelectedIndex = -1;
    }


    cmdReader.Close();
    con.Close();
}

public void FillForm(int index)
{
    ListItem item = ddlCategory.Items[index];
    txtName.Text = item.Text + " " + (Convert.ToInt32(item.Value) + 1).ToString();
    txtAbbrv.Text = item.Text.Substring(0, 1) + (Convert.ToInt32(item.Value) + 1).ToString();
}

public void ddlCategory_SelectedIndexChanged(Object sender, EventArgs e)
{
    //When I break here SelectedIndex always = 1.
    FillForm(ddlCategory.SelectedIndex);
}

我只是希望能够根据所选索引填充表单,但我似乎无法得到正确的答案。任何帮助表示赞赏。

【问题讨论】:

  • 我假设您启用了视图状态?您是否检查了请求以查看为该控件返回的值是什么?下拉列表中有多少项?
  • 我很确定我以前遇到过这个问题。您可以尝试使更新面板有条件并为您的 DropDownLists selectedindex 更改事件设置异步回发触发器吗?
  • 现在下拉列表中有 4 个项目。我不确定您通过检查请求以查看返回的值是什么意思。我检查了 SelectedIndexChanged 中的 ddlCategory.SelectedIndex,它始终为 1。
  • 我将更新面板更改为条件并添加了触发器。它没有改变任何东西。当我更改 DropDownList 选择时,它会自动跳回列表中的第一项。
  • GetCategories() 是从其他任何地方调用的吗?

标签: asp.net drop-down-menu autopostback


【解决方案1】:

您是否启用或禁用了 Viewstate? SelectedIndex 是基于零的,所以它正在重置,我认为它会被设置为零。

另外,下拉列表的其他属性设置为什么?选择的值是否正确?

尝试其他浏览器。我遇到了级联下拉菜单的问题,它在 Firefox 中没有触发/行为正确。

【讨论】:

  • ViewState 已启用。如果我禁用它,那么我的列表会在 PostBack 上被清除。
  • 我在 Internet Explorer 中尝试过,但遇到了同样的问题。现在 SelectedIndexChanged 甚至没有被触发,因为 DropDownList 只是在我更改它时重置为顶部选择。
  • 我发现了问题。从我的 SQL 语句填充的值包含重复的值。出于某种原因,这导致整个事情以奇怪的方式出现故障。通过确保空值变为 0,代码开始完美运行。感谢大家的帮助。
【解决方案2】:

我发现了问题。从我的 SQL 语句填充的值包含重复的值。由于某种原因,这导致整个事情以奇怪的方式出现故障,因此每次我选择一个 ListItem 时,整个列表都会重置。通过确保没有重复值,代码开始完美运行。感谢大家的帮助。

【讨论】:

    【解决方案3】:

    为下拉列表添加 AppendDataBoundItems="true"

    【讨论】:

    • 这完全解决了我的问题!!!我从 arraylist 填充了我的 drowndownlist.datasource。这一定混淆了指数。设置 appendatabounditems 修复了它wooooO!O!!#
    • 救命稻草 :) 谢谢!
    • 不错!它修复了我所有的下拉菜单!
    【解决方案4】:

    我遇到了同样的问题,我的下拉列表状态视图在另一个控件的回发事件之后立即跳转到索引 1。我的建议只是确保您的下拉列表值不为空

    希望对某人有所帮助.... :)

    【讨论】:

    • 请详细说明您的答案。这个问题没有任何意义表明存在空值。
    【解决方案5】:

    确保您的值字段对于每个下拉列表项都是唯一的。如果每个项目的值相同,则默认索引为 0。

    【讨论】:

    • 整个下午都在拔头发,试图弄清楚这一点。我有两个具有相同Value="-1" 的 ListItem,更改其中一个解决了问题。
    【解决方案6】:

    我在尝试为 DataValueField 使用组合列值时发生了这种情况。例如:

    存储过程是这样写的:

    SELECT
        Description,
        Value1 + ',' + Value2 AS Value
    FROM
        DropDownListTable
    

    DataValueField 使用了 Value 字段,它是由逗号分隔的 Value1 和 Value2 字段的组合。 (我也尝试了一个管道,没有分隔符,但结果相同)

     With ddl
         .DataTextField = "Description"
         .DataValueField = "Value"
         .DataSource = ds
         .DataBind() 
     End With
    

    只要我使用 Value1 或 Value2 作为 DataValueField,问题就消失了。

    【讨论】:

      【解决方案7】:

      我也为此苦苦挣扎,我尝试了 EnableViewState="true" ViewStateMode="Enabled" 但实际上不需要,您只需在 Page_Load 事件中添加 IsPostBack 即可。 别忘了加上IsPostBack,就是这样……

      if (!IsPostBack)
      {
          LoadDropDown();
      }
      

      【讨论】:

        【解决方案8】:

        如果不是 IsPostBack,您必须将列表加载到 DropDownList

        示例代码:

        if (!IsPostBack)
        {
           //fill here
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-14
          • 1970-01-01
          • 2013-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多