下拉列表不能正确选择项目

本文关键字:选择 项目 不能 下拉列表 | 更新日期: 2023-09-27 17:50:54

我在ASP做一个项目。净WebForms。虽然我已经做过很多次了,但这次下拉列表还是让我很困扰。

我从DB获取项目,然后将它们添加到我的下拉列表一个接一个使用FOR循环。这很好。但问题是,我不能舒适地从列表中选择一个项目,每当我试图从下拉列表中选择一个项目时,它就会将选择固定到第一个元素上,因此很难选择所需的项目。

我怎样才能解决这个问题?

假设我将光标移到列表中的第9项上,然后它也选择了第1项和第9项,速度如此之快,以至于我看到它们都被选中了。

后台代码

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        DropDownList1.Items.Clear();
        con.ConnectionString = ConfigurationManager.ConnectionStrings["familyConnectionString"].ConnectionString;
        con.Open();
        adp = new SqlDataAdapter("select distinct family_head from family", con);
        DataSet ds = new DataSet();
        adp.Fill(ds, "family");
        con.Close();
        for (int i = 0; i < ds.Tables["family"].Rows.Count; i++)
            DropDownList1.Items.Add(ds.Tables["family"].Rows[i][0].ToString());
    }
}

ASPX

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:DropDownList ID="DropDownList1" runat="server" Width="150px">
    </asp:DropDownList>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <asp:DropDownList ID="DropDownList2" runat="server" Width="150px">
    </asp:DropDownList>
    &nbsp;&nbsp;&nbsp;&nbsp;
    <asp:Button ID="Button1" runat="server" Height="30px" onclick="Button1_Click" 
        Text="Submit" Width="145px" BackColor="#465767" ForeColor="White" />
    <asp:RoundedCornersExtender ID="Button1_RoundedCornersExtender" runat="server" 
        Enabled="True" TargetControlID="Button1" Corners="All" Radius="10">
    </asp:RoundedCornersExtender>
    <br />
    <br />
    <br />
</asp:Content>

一个CSS关键帧动画在页面背景中工作,这可能是一个原因吗?

下拉列表不能正确选择项目

关于WebControls的数据绑定如何工作,似乎存在某种混淆。最好的参考是:http://msdn.microsoft.com/en-us/library/ms178472.aspx

假设显示了DropDownList1的所有绑定代码:

DropDownList1.Items.Clear();

不应该是必需的,因为条目不应该在每次PostBack时持久化。(至少我是这样认为的,因为如果没有再次绑定数据源,那么每次PostBack之后所有Items都会丢失)。

如果你想使用下拉列表,下拉列表需要在每个PostBack上都有项目。您正在使用

if (!Page.IsPostBack)

这意味着,如果您有PostBack,则不会再次绑定项。在上面发布的链接中,你可以看到控件在loaddevent期间设置了它们的属性(比如在点击按钮之前选择了哪个项目),这意味着这些项目需要在生命周期的早期被绑定,比如在OnInit期间。

试试这样写:

protected void BindDropDownList1()
{
 con.ConnectionString = ConfigurationManager.ConnectionStrings["familyConnectionString"].ConnectionString;
 con.Open();
 adp = new SqlDataAdapter("select distinct family_head from family", con);
 DataSet ds = new DataSet();
 adp.Fill(ds, "family");
 con.Close();
 for (int i = 0; i < ds.Tables["family"].Rows.Count; i++)
   DropDownList1.Items.Add(ds.Tables["family"].Rows[i][0].ToString());
}
    protected override void OnInit(EventArgs e)
    {
       this.BindDropDownList1();
       base.OnInit(e);
    }

另一个建议是使用DropDownList的DataSource属性,而不是DropDownList1.Items.Add。如果您使用这种方法,您需要设置下拉列表的DataKeyValue和DataKeyMember属性:

protected void BindDropDownList1()
{
 con.ConnectionString = ConfigurationManager.ConnectionStrings["familyConnectionString"].ConnectionString;
 con.Open();
 adp = new SqlDataAdapter("select distinct family_head from family", con);
 DataSet ds = new DataSet();
 adp.Fill(ds, "family");
 con.Close();
 DropDownList1.DataSource = ds;
 DropDownList1.DataBind();
}

编辑:
我想我发现了你的错误。您正在使用AjaxControlToolKit控件,但仍在使用ScriptManager。大约2年,AjaxControlToolKit控件需要ToolkitScriptManager。将ScriptManager替换为ToolkitScriptManager