8

在网上做了很多研究之后,我仍然被这个问题难住了。我有一个页面,将类​​别的名称和计数加载到下拉列表中。我只在!(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);
}

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

4

8 回答 8

14

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

于 2012-12-11T06:56:45.490 回答
4

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

于 2011-04-14T22:43:42.537 回答
4

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

于 2013-02-15T05:52:59.680 回答
1

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

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

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

于 2011-04-13T21:47:56.387 回答
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,问题就消失了。

于 2014-07-18T14:44:42.913 回答
1

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

if (!IsPostBack)
{
    LoadDropDown();
}
于 2017-02-04T18:05:35.137 回答
1

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

示例代码:

if (!IsPostBack)
{
   //fill here
}
于 2017-11-13T12:34:28.580 回答
0

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

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

于 2013-02-14T09:11:37.603 回答