【问题标题】:dropdown list does not let select items properly下拉列表不允许正确选择项目
【发布时间】:2013-01-05 19:11:14
【问题描述】:

我正在 ASP.NET WebForms 中创建一个项目。虽然我已经做了很多次了,但是这次下拉列表让我很困扰。

我从数据库中获取项目,然后使用 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 关键帧动画在页面背景中工作,这是一个原因吗?

【问题讨论】:

  • 你的浏览器是什么,请在此处发布代码和.aspx html代码。
  • 发布了代码和标记。
  • 我想 DropDownList1 有问题吗?你在哪里尝试得到它的选择?我看到你使用 IsPostBack。
  • 我没有对我将使用所选项目的部分进行编码。你能告诉我确切的问题是什么吗?在您的建议之后,我还添加了 ispostback。
  • 从内容占位符中删除您的脚本管理器,并将其移动到您的标记顶部的表单标记之后。

标签: c# asp.net drop-down-menu


【解决方案1】:

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

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

DropDownList1.Items.Clear();

不应该是必需的,因为这些项目不应该在每个 PostBack 中持续存在。 (至少我是这样认为的,因为如果 DataSource 没有再次绑定,那么在每次 PostBack 之后所有的 Item 都会丢失)。

如果要使用 DropDownList,则 DropDownList 需要在每个 PostBack 上都有项目。你正在使用

if (!Page.IsPostBack)

这意味着,如果您有 PostBack,则不会再次绑定项目。在上面发布的链接中,您可以看到控件在 LoadEvent 期间设置其属性(例如在单击按钮之前选择了哪个项目),这意味着需要在生命周期的早期绑定项目,例如在 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。如果使用这种方式,需要设置 DropDownList 的 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

【讨论】:

  • 这根本不是问题。请留在主题。我在下拉列表中选择项目时遇到问题,gui 工作不完美。当我在下拉列表中移动鼠标时,选择在第一个和悬停的菜单项之间摆动。为什么?
  • 您检查过网站是否存在 JavaScript 错误吗?尝试注释掉 RoundedCornersExtender 并查看问题仍然存在。
  • 使用 ToolkitScriptManager 完成,没有帮助!我想让你知道在 Firefox 和 IE 中一切正常。
  • 我从页面背景中删除了 CSS 关键帧动画,它工作正常。但我仍然不知道原因。
  • 奇怪的客户端副作用通常是由 JavaScript 错误引起的。看看 chrome 中的开发者工具和 javascript 控制台,也许你会看到一些错误。很高兴您能够隔离您的问题
猜你喜欢
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多