不能使用C#在DropDownList中选择多个项目
本文关键字:选择 项目 DropDownList 不能 | 更新日期: 2023-09-27 18:09:47
当我尝试从下拉框"无法在DropDownList中选择多个项目"中选择一个项目时,会出现此错误。有人能帮帮我吗?我不知道为什么我会得到这个。这是我的代码:
private void Bind_GridView()
{
this.BindGroupNameList(DropDownList1);
}
private void GetGroupNameList(DropDownList DropDownList1)
{
String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
SqlConnection con2 = new SqlConnection(strConnString);
SqlDataAdapter sda = new SqlDataAdapter();
SqlCommand cmd1 = new SqlCommand("select distinct Name" +
" from MyTable");
cmd1.Connection = con2;
con2.Open();
DropDownList1.DataSource = cmd1.ExecuteReader();
DropDownList1.DataTextField = "Name";
DropDownList1.DataValueField = "Name";
DropDownList1.DataBind();
con2.Close();
DropDownList1.Items.FindByValue(ViewState["MyFilter"].ToString())
.Selected = true;
}
//on item change
protected void NameChanged(object sender, EventArgs e)
{
DropDownList DropDownList1 = (DropDownList)sender;
ViewState["MyFilter"] = DropDownList1.SelectedValue;
this.Bind_GridView();
}
这是我在aspx 中的下拉框
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="NameChanged"
DataTextField="Name" DataValueField="Name"
AppendDataBoundItems="true">
<asp:ListItem Text="ALL" Value="ALL"></asp:ListItem>
<asp:ListItem Text="Top 10" Value="10"></asp:ListItem>
</asp:DropDownList>
这是页面加载的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ViewState["MyFilter"] = "ALL";
this.Bind_GridView();
}
}
这是调用GetGroupNameList:的方法
private void Bind_GridView()
{
DataTable dt = new DataTable();
String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(strConnString);
SqlDataAdapter sda = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand("sp_filter_Names");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@MyFilter", ViewState["MyFilter"].ToString());
cmd.Connection = con;
sda.SelectCommand = cmd;
sda.Fill(dt);
GV_Test.DataSource = dt;
GV_Test.DataBind();
GetGroupNameList();
}
更改此行:
DropDownList1.Items.FindByValue(ViewState["MyFilter"].ToString())
.Selected = true;
到此:
DropDownList1.SelectedValue = ViewState["MyFilter"].ToString();
问题是您已经选择了一个项目(可能是列表中的第一个(,并且您正在搜索另一个项目并将其选中。请记住,具有多个选定项目对ListBox
和CheckListBox
有效,但对DropDownList
无效。
选择其中一个ListItem
并不会自动取消选择ListItemColletion
中的其他项目。
这真的很简单,正如Adrian所提到的,当你在下拉列表中选择了一个项目,然后在代码的其他地方选择了另一个项目时,就会发生这个错误。
为了解决这个问题,在GetGroupNameList
上设置一个制动点,如果错误出现在这一行:
DropDownList1.Items.FindByValue(ViewState["MyFilter"].ToString()).Selected = true;
将以下代码行放在其正上方:
DropDownList1.ClearSelection();
如果该行没有抛出错误,则意味着第二次选择是在GetGroupNameList
方法调用之后完成的,在这种情况下,将DropDownList1.ClearSelection();
直接放在GetGroupNameList
的调用之后
DropDownList1.ClearSelection();
DropDownList1.FindByValue("parameter").Selected = true;
请确保没有将多个ddl数据绑定到同一数据源。被选中是一个项的属性,因此,如果不同的ddl从同一数据源中选择不同的项,则每个ddl最终都会选择多个项,这可能就是这里发生的情况。。
您可以尝试:
DropDownList1.ClearSelection();
线路前:
DropDownList1.Items.FindByValue(ViewState["MyFilter"].ToString())
.Selected = true;
我建议您不要在aspx中添加DropDownList的默认值,并在绑定数据之前清除所有项。
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="NameChanged"
DataTextField="Name" DataValueField="Name" >
</asp:DropDownList>
并将GetGroupNameList方法更改为以下
private void GetGroupNameList(DropDownList ddl)
{
ddl.Items.Clear();
String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
SqlConnection con2 = new SqlConnection(strConnString);
SqlDataAdapter sda = new SqlDataAdapter();
SqlCommand cmd1 = new SqlCommand("select distinct Name" +
" from MyTable");
cmd1.Connection = con2;
con2.Open();
ddl.DataSource = cmd1.ExecuteReader();
ddl.DataTextField = "Name";
ddl.DataValueField = "Name";
ddl.DataBind();
con2.Close();
ddl.Items.Insert(0, new ListItem("Top 10", "10"));
ddl.Items.Insert(0, new ListItem("ALL", "ALL"));
ListItem oListItem = ddl.Items.FindByValue(ViewState["MyFilter"].ToString());
if(oListItem != null){
ddl.ClearSelection();
ddl.SelectedValue = oListItem.Value;
}
}