Asp.NET DropDownList在PostBack之后重置SelectedIndex

时间:2011-04-13 21:43:32

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

在网上做了大量的研究后,我仍然对这个问题感到难过。我有一个页面,将名称和类别数加载到下拉列表中。我只在!(Page.IsPostBack)时执行此操作。当AutoPostBack触发SelectedIndex = 0时。我尝试过几种不同的东西。这是我的代码:

PAGE

<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);
}

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

8 个答案:

答案 0 :(得分:11)

为下拉列表添加AppendDataBoundItems =“true”

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

尝试使用其他浏览器。我有一个级联下拉的问题,它在Firefox中没有正确触发/表现。

答案 4 :(得分:1)

尝试使用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,问题就会消失。

答案 5 :(得分:0)

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

希望有人帮助......:)

答案 6 :(得分:0)

我也在努力解决这个问题,我尝试了 EnableViewState="true" ViewStateMode="Enabled" 但实际上并不需要它,你只需要在Page_Load事件中添加IsPostBack。 不要忘记添加IsPostBack,就是它......

if (!IsPostBack)
{
    LoadDropDown();
}

答案 7 :(得分:0)

如果不是IsPostBack

,你必须将列表加载到DropDownList

示例代码:

if (!IsPostBack)
{
   //fill here
}