在下拉列表中不能选择多个项目。

43

我有两个下拉列表和一个按钮。我在我的项目中使用了断点,一切都正常工作。但是当我从按钮的函数中退出时,我会收到以下错误:

不能在DropDownList中选择多个项。

这是我的按钮代码:

 protected void Button1_Click(object sender, EventArgs e)
    {

        if (ddlPlayer1.SelectedItem.Value != "0" || ddlPlayer2.SelectedItem.Value != "0" && ddlPlayer1.SelectedItem.Value != ddlPlayer2.SelectedItem.Value)
        {
            lblPlayer1Score.Text = Repository.Instance.ReturnScore(ddlPlayer1.SelectedValue.ToString(), ddlPlayer2.SelectedValue.ToString()).Rows[0][0].ToString();
            lblPlayer2Score.Text = Repository.Instance.ReturnScore(ddlPlayer2.SelectedValue.ToString(), ddlPlayer1.SelectedValue.ToString()).Rows[0][0].ToString();


        }

        ddlPlayer1.DataBind();
        ddlPlayer2.DataBind();
    }

我在这里做错了什么?


除了这里发布的答案之外,我还发现了另一个可能导致此错误的原因。请参见我在这里这个问题的回答。 - Tom Hamming
8个回答

119

通常出现这个错误是因为你按照以下方式加载了你的ddl:

ddl.FindByValue("parameter").Selected = true; 
为了解决这个错误,您应该按照以下方式清除前一个下拉列表的选择:
ddl.ClearSelection();
ddl.FindByValue("parameter").Selected = true; 

或者您可以采用以下方法:

ddl.SelectedItem = "parameter";

希望我的回答能够帮助到某些人。;-)


5
ClearSelection() 是我所需的! - Kristopher
1
你不能使用:ddl.SelectedItem = "parameter"; 因为SelectedItem是只读的(更准确地说,它是一个属性,框架只公开了get访问器)。 - Alberto
我的问题也解决了,谢谢。遗憾的是,框架没有告诉你哪个ddl引发了异常...如果屏幕上有很多ddl,这可能会成为一个问题。 - ashilon

56

确保您不会将多个下拉列表(dropdown lists)绑定到同一数据源。选中是项目的属性,因此,如果不同的下拉列表从相同的数据源选择不同的项目,则每个下拉列表都会具有多个选定项目,这可能就是此处发生的情况。


12
如果您将相同的ListItem添加到多个ddl中,则在未绑定的DropDownList中也会发生这种情况。 - Laramie
2
谢谢@Laramie,这正是我所做的。我创建了一个“请选择”列表项,并将其添加到每个下拉列表中。这似乎让网站感到困惑。为每个下拉列表重新创建它就解决了问题。 - Michael La Voie
1
谢谢@Laramie,您也解决了我的问题!我将我的“请选择...”列表项放在了一个“util”库中,现在我将其作为访问器使用,只定义了“get”,在每个请求中使用“new”。 - Ninjanoel

22

这段代码将解决此问题:

YourDropDownId.ClearSelection(); 

最佳答案 - Nahid

2

我尝试在将数据读入 DropDownList 后将另外两个列表项添加到顶部。

其中一个项目是 "请选择...",第二个是 "未在此列出..."。 因此,我创建了一个列表项:

ListItem li1 = new ListItem("please pick one...", "999");
ListItem li2 = new ListItem("not listed here...", "555");

然后我尝试将这两个 ListItems 添加到三个 DropDownList 中。之后我遇到了相同的错误。

为每个 DropDownList 创建新的 ListItem 实例后,问题就解决了...


1
之前的回答提到ddl.SelectedItem = "parameter";作为一种选项。然而,SelectedItem是只读的。
使用ddl.SelectedValue = "value"也可以解决OP的错误。

0
 protected void Button1_Click(object sender, EventArgs e)
    {

        if (ddlPlayer1.SelectedIndex>0 || ddlPlayer2.SelectedIndex>0)
        {
            lblPlayer1Score.Text = Repository.Instance.ReturnScore(ddlPlayer1.SelectedValue.ToString(), ddlPlayer2.SelectedValue.ToString()).Rows[0][0].ToString();
            lblPlayer2Score.Text = Repository.Instance.ReturnScore(ddlPlayer2.SelectedValue.ToString(), ddlPlayer1.SelectedValue.ToString()).Rows[0][0].ToString();


        }

    }

0
发现另一种获取错误的方法:
        ddlFromBudget.Items.Clear();

        ListItem newItem = new ListItem();
        newItem.Text = "Not Set";
        newItem.Value = "0";
        ddlFromBudget.Items.Add(newItem);

        if (ddlB1.SelectedValue.ToString() != "0")
        {
            newItem = new ListItem();
            newItem.Text = ddlB1.SelectedItem.ToString();
            newItem.Value = "1";
            ddlFromBudget.Items.Add(newItem);
        }

这行代码 ddlFromBudget.Items.Add(newItem); 设置了 newItem.Selected = True。 如果没有这行代码 newItem = new ListItem();,你会得到错误,因为选中标志现在对添加到 ddl 中的两个项目都是 true。


-1

如果您要检查两个下拉列表的选定索引是否都大于0,则应该像这样检查: if (ddlPlayer1.SelectedIndex > 0 || ddlPlayer2.SelectedIndex > 0) {}

我认为出错是因为使用了“DropDownList1.SelectedItem.Value”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接