Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET Web Forms DropDownList has a SelectedValue which is invalid because it does not exist in the list of items

First of all there has been questions ( DropDownList has a SelectedValue which is invalid because it does not exist in the list of items , DropDownList "has a SelectedValue which is invalid because it does not exist in the list of items" , asp:DropDownList Error: 'DropDownList1' has a SelectedValue which is invalid because it does not exist in the list of items ) about this and there are proposed workarounds but my question is really WHY this happens. What is more I am not satisfied with the suggested workarounds and I find them quite ugly.

So there is a page with a drop down list and a button:

<%@ 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>

I bind ddlTest with some items on Page_Init and then in btnTest_Click I bind again:

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
        }
    }
}

Why do I get the exception. I tried different versions of these and none of them works. I tried using only ClearSelection but still got the same exception. Is this bug in the control or something I miss. Are the ugly workarounds from the other questions the only solution?

Note - the bug is reproduceable even if the button is removed and the all the code is moved in a single event handler. Just bind once set selected value and bind again.

like image 952
Stilgar Avatar asked May 04 '11 15:05

Stilgar


2 Answers

Why do I get the exception.

After Page_Init() is called, ddlTest has been bound to 3 items: "1", "2" and "3". You then set the SelectedValue to "3" and manipulate all sorts of things related to the DropDownList control. But the control is still bound to the previous list -- you haven't called .DataBind() again even though you've changed the DropDownList properties. The exception occurs because the control is still bound to the {1, 2, 3}, it's hanging on to the previous .SelectedValue and you've just tried to .DataBind() it to a list that does not include "3".

like image 31
Mark A Avatar answered Sep 30 '22 04:09

Mark A


I've submitted a bug on Connect for the issue. It was resolved as "Won't fix" which in my mind means it is in fact a bug. A workaround was provided:

ddlTest.Items.Clear();
ddlTest.SelectedValue = null;

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

I kind of consider this the answer.

like image 112
Stilgar Avatar answered Sep 30 '22 03:09

Stilgar