我在ASP.NET 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>
<asp:DropDownList ID="DropDownList2" runat="server" Width="150px">
</asp:DropDownList>
<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关键帧动画正在页面背景中工作,这可能是一个原因吗?
答案 0 :(得分:0)
对于WebControls数据绑定的工作原理似乎存在某种混淆。最好的参考是:http://msdn.microsoft.com/en-us/library/ms178472.aspx
在假设下,显示了DropDownList1的所有绑定代码:
DropDownList1.Items.Clear();
不应该是必要的,因为每个PostBack都不应该保留这些项目。 (至少我假设,因为如果DataSource没有再绑定,每个PostBack后所有Items都会丢失。)
如果要使用DropDownList,DropDownList需要在每个PostBack上都有项目。您正在使用
if (!Page.IsPostBack)
这意味着,如果您有PostBack,则不会再次绑定项目。在上面发布的链接中,您可以看到Controls在LoadEvent期间设置了它们的属性(比如在单击Button之前选择了哪个项目),这意味着项目需要在生命周期的早期绑定,比如在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
。