ASP.NET Web窗体DropDownList具有一个无效的SelectedValue,因为它不存在于项列表中

Sti*_*gar 16 asp.net webforms

首先有一些问题(DropDownList有一个无效的SelectedValue,因为它不存在于项目列表中,DropDownList"有一个无效的SelectedValue,因为它不存在于项目列表中",asp:DropDownList错误:'DropDownList1'有一个SelectedValue,它是无效的,因为它不存在于项目列表中)关于这一点,并提出了解决办法,但我的问题是为什么会发生这种情况.更重要的是我对建议的解决方法不满意,我发现它们非常难看.

所以有一个页面有一个下拉列表和一个按钮:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="TestWebApplication.WebForm2" ViewStateMode="Disabled" %>

<html lang="en" >
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="ddlTest" runat="server">
        </asp:DropDownList>
        <asp:Button Text="Test" ID="btnTest" runat="server" onclick="btnTest_Click" />
    </div>
    </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我将ddlTest与Page_Init上的一些项绑定,然后在btnTest_Click中再次绑定:

using System;

namespace TestWebApplication
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Init(object sender, EventArgs e)
        {
            //SelectedIndex is -1, SelectedValue is "", SelectedItem is null
            ddlTest.DataSource = new[] { 1, 2, 3 };
            ddlTest.DataBind();
            ddlTest.SelectedValue = "3";
        }

        protected void btnTest_Click(object sender, EventArgs e)
        {
            //SelectedIndex is 2, SelectedValue is "3", SelectedItem is {3}
            ddlTest.ClearSelection();
            //SelectedIndex is 0, SelectedValue is "1", SelectedItem is {1}
            ddlTest.SelectedIndex = -1; //Nothing changes including SelectedIndex
            ddlTest.SelectedValue = ""; //Nothing changes including SelectedValue
            ddlTest.Items.Clear();
            //SelectedIndex is -1, SelectedValue is "", SelectedItem is null
            ddlTest.DataSource = null; //Nothing changes except for the DataSource property
            ddlTest.DataSource = new[] { 1, 2 };
            ddlTest.DataBind();//Exception!
            //'ddlTest' has a SelectedValue which is invalid because it does not exist in the list of items.
            //Parameter name: value
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我会得到例外.我尝试了不同版本的这些,但没有一个可行.我尝试只使用ClearSelection但仍然得到相同的异常.是控件中的这个错误还是我想念的错误.来自其他问题的难看的解决方法是唯一的解决方案吗?

注意 - 即使删除了按钮并且所有代码都在单个事件处理程序中移动,该错误也是可重现的.只需绑定一次设置选定值并再次绑定.

Sti*_*gar 32

我已经在Connect上提交了一个关于此问题的错误.它被解决为"不会修复",在我看来它意味着它实际上是一个错误.提供了一种解决方法:

ddlTest.Items.Clear();
ddlTest.SelectedValue = null;
Run Code Online (Sandbox Code Playgroud)

https://connect.microsoft.com/VisualStudio/feedback/details/666808/asp-net-dropdownlist-selectedvalue-is-persisted-which-results-in-exception-if-the-control-is-databound-second-时间

我有点认为这是答案.

  • 谢谢你,先生.更多的证据表明我并不疯狂. (2认同)