下拉列表的选定索引与显示的选定元素的位置不匹配



我有一个下拉列表和一个添加按钮。单击添加按钮时,下拉列表中的选定项应添加到数据库中。 但是,添加按钮调用的函数中使用的选定索引值是错误的。 它与当前所选项目的实际索引不匹配(大多数情况下)。

这是下拉菜单和按钮:

<asp:DropDownList runat="server" id="ddlNewCreature" AutoPostBack = "false" DataMember="0"></asp:DropDownList>
<asp:Button ID="btnAddCreature" runat="server" Text="Add" onClick="AddCreature"/>

下面是背后的代码:

protected void Page_Load(object sender, EventArgs e)
{                     
    if (!IsPostBack)
    {
    if (ddParent1.Items.Count == 0)
    {
        if (ddBaby.Items.Count == 0)
        {
        loadCreatureLists(true, true);
        }
        else
        {
        loadCreatureLists(true, false);
        }
    }
    else
    {
        if (ddBaby.Items.Count == 0)
        {
        loadCreatureLists(false, true);
        }
    }
    }
}

protected void loadCreatureLists(Boolean loadParents, Boolean loadOffspring )
{
    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Drin"].ConnectionString);
    string sSql = "select creature, element1, element2 from dbo.tinycastlecreatures order by creature";
    SqlCommand cmd = new SqlCommand(sSql, conn);
    SqlDataReader reader;
    try
    {
    conn.Open();
    reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        ListItem newItem = new ListItem();
        newItem.Text = reader["creature"].ToString();
        newItem.Value = normalizeElementOrder(reader["element1"].ToString(),reader["element2"].ToString());
        if (loadParents && !chkMine.Checked)
        {
        ddParent1.Items.Add(newItem);
        ddParent2.Items.Add(newItem);
        }
        if (loadOffspring)
        {
        ddBaby.Items.Add(newItem);
        ddlNewCreature.Items.Add(newItem);
        }
    }
    reader.Close();
    }
    catch (Exception err) { }
    finally { if (!loadParents || !chkMine.Checked) { conn.Close(); } }
}
protected void AddCreature(object sender, EventArgs e)
{
    int indx = ddlNewCreature.SelectedIndex;
    string sCreature = ddlNewCreature.Items[indx].Text.ToString();
    for (int i = 0; i < ddlNewCreature.Items.Count; i++ )
    {
    sCreature = ddlNewCreature.Items[i].Text.ToString();
    }
    ddlNewCreature.SelectedIndex = 0;
    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Drin"].ConnectionString);
    conn.Open();
    string sSql = "[dbo].[tinycastle_add_user_creature] '";
    sSql += sCreature;
    sSql += "','deb'"; 
    SqlCommand cmd = new SqlCommand(sSql, conn);
    cmd.ExecuteNonQuery();
    sCreature = ddlNewCreature.Items[indx].Text.ToString();
    sqlMineSource.DataBind();
    gridMine.DataBind();
}

B.Yaylaci 关于检查下拉列表更改事件中SelectedIndex的建议是正确的,以找出为什么(何时? :))我认为索引与您的预期不匹配。此外,如果您只需要下拉列表中的文本,则使用 SelectedValue 属性会更容易(也更准确)。https://stackoverflow.com/a/4399747

我通过删除各种下拉列表的填充方式并将它们绑定到 SQLDataStore 来规避这个问题。 我不知道为什么这有帮助,但它确实有帮助。

使用 ddlNewCreature.SelectedValue 这将解决您的问题。选择值 " 为您提供所选下拉列表的正确索引值。这对我有用。

最新更新