1

我的 Web 表单以两个文本框、两个按钮、一个 CheckBoxList(绑定到数据库查询的结果)和一个空的 DropDownList 开始。

当用户在第一个 TextBox 中输入搜索短语并按 Enter(或单击第一个按钮“搜索”)时,将出现一个 GridView,其中填充了从数据库中提取的行。当用户点击其中一行上的 Select 按钮时,DropDownList 被填充(绑定到数据库查询的结果)并启用(如果查询返回结果——如果没有结果,则保持禁用状态)。当第二个Button(“保存设置”)被点击时,相关数据被保存到DB,GridView的选择被清空,DropDownList被清空和禁用。

以上所有工作。问题来自 DropDownList。我无法让 C# 代码识别不断变化的 SelectedIndex;根据我如何调整代码,索引始终为 0(并且 DropDownList 被迫停留在第一项)或 -1(并且列表被禁用)。

下拉列表代码:

<asp:DropDownList ID="myList" runat="server" AutoPostBack="True" 
    DataTextField="MyName" DataValueField="MyID" 
    Enabled="False" onselectedindexchanged="myList_SelectedIndexChanged" />

C#代码:

protected void myGrid_SelectedIndexChanged(object sender, EventArgs e)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        if (myGrid.SelectedIndex >= 0)
        {
            int id = int.Parse(myGrid.Rows[myGrid.SelectedIndex].Cells[2].Text);
            connection.Open();

            string query = "..."; // Omitted for brevity; the query is correct
            SqlDataSource source = new SqlDataSource(connectionString, query);
            source.SelectParameters.Add("Param1", TypeCode.String, id.ToString());
            DataTable dt = ((DataView)source.Select(DataSourceSelectArguments.Empty)).Table;
            dt.AcceptChanges();
            myList.DataSource = dt;
            myList.DataBind();
            myList.Enabled = myList.Items.Count != 0;

            if (!myList.Enabled)
            {
                myList.Items.Add(new ListItem("No Results", "0"));
            }
        }
    }
}

protected void myList_SelectedIndexChanged(object sender, EventArgs e)
{
    // ((DropDownList)sender).SelectedIndex == -1
}

我读到在寻找解决我的问题的方法时 DropDownList 存在一些问题,但除了设置 AutoPostBack="True" 的注释之外,我发现的其他情况都没有帮助。

4

1 回答 1

2

DropDownList 丢失其 SelectedIndex 值的一个常见原因是,在回发期间再次与数据绑定。您是否将数据填充到代码中其他地方的 DropDownList?也许还有其他原因导致 GridView 的 SelectedIndex 事件再次触发?

另一种想法是更改 DropDownList 的 Enabled 状态可能会导致此行为。在不禁用 DropDownList 的情况下尝试您的代码,看看是否有变化。

于 2013-10-24T19:43:36.187 回答