Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

has a SelectedValue which is invalid because it does not exist in the list of items. How do you debug?

I am having problems with asp.net binding to a dropdownlist and I have no clue on how to debug. I checked out the other questions about this on stack but nothing has helped. As far as I can see the "name" it should select is in the list.

<asp:DropDownList ID="dd1" runat="server" DataSourceID="ADataSource" DataTextField="Name" 
                                                    DataValueField="Name" SelectedValue='<%# Bind("Name") %>'   Width="255" 
                                                    AppendDataBoundItems="true" TabIndex="3"  Font-Size="small"  EnableViewState="true"    >
                                             <asp:ListItem Text="Select"  Value="" />
                                           </asp:DropDownList>

Following is the error

System.ArgumentOutOfRangeException was unhandled by user code Message='dd1' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value Source=System.Web ParamName=value StackTrace: at System.Web.UI.WebControls.ListControl.PerformDataBinding(IEnumerable dataSource) at System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e) at System.Web.UI.WebControls.ListControl.PerformSelect() at System.Web.UI.WebControls.BaseDataBoundControl.DataBind() at System.Web.UI.Control.DataBindChildren() at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.Control.DataBind() at System.Web.UI.Control.DataBindChildren() at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.Control.DataBind() at System.Web.UI.Control.DataBindChildren() at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.Control.DataBind() at System.Web.UI.Control.DataBindChildren() at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.WebControls.DetailsView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) at System.Web.UI.WebControls.DetailsView.PerformDataBinding(IEnumerable data) at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) at System.Web.UI.WebControls.DataBoundControl.PerformSelect() at System.Web.UI.WebControls.BaseDataBoundControl.DataBind() at System.Web.UI.WebControls.DetailsView.DataBind() at storeUpdate.GvStoresSelect_SelectedIndexChanged(Object sender, EventArgs e) in line 233 at System.EventHandler.Invoke(Object sender, EventArgs e) at System.Web.UI.WebControls.GridView.OnSelectedIndexChanged(EventArgs e) at System.Web.UI.WebControls.GridView.HandleSelect(Int32 rowIndex) at System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) at System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) at System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) at System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) at System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) at System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) at System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) at System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) InnerException:

like image 239
chobo2 Avatar asked Feb 01 '13 20:02

chobo2


2 Answers

The value coming from <%# Bind("Name") %>, which is passed to the SelectedValue property, does not match an item in its collection. Most likely causes:

  • DropDownList has no items because the evaluation happens before the list gets bound
  • The list is bound but is missing this particular value
  • The value returned could be null
like image 182
Brian Mains Avatar answered Oct 16 '22 15:10

Brian Mains


I realize this is an old thread, but Google brought this up as the first option for this problem - with a fairly generic search term.

Anyway, the problems I had with this and the way I solved it are as follows. The problem will either arise, like Brian Mains said for the following reasons :

  • DropDownList has no items because the evaluation happens before the list gets bound
  • The list is bound but is missing this particular value
  • The value returned could be null

The problem i was experiencing, even though it wasn't very clear as i didn't get errors on some of the other DropDowns i was using the same method for, was that on load of the page, i was trying to use this code-behind to add an item to the DropDownList :

drpNationality.Text = GlobalScript.CountDatabaseRecords("SELECT [nationality_desc] FROM [tbl_people] INNER JOIN [tbl_lkup_nationality] AS nationality ON [nationality] = [nationality_id] WHERE [person_id] ='" + Session["ID"] + "'");

And here is the DropDown HTML (which had items populated by a DataSource) :

<label>Nationality:</label>
<asp:DropDownList ID="drpNationality" runat="server" DataSourceID="Nationality_Datasource" DataTextField="nationality_desc" DataValueField="nationality_id">
</asp:DropDownList>

Now, the problem I was getting was that the data hadn't been bound to the control at the time of Load, when i was trying to add items in the code-behing. Because I was trying to pre-select a value from the database at start-up for the user (which did exist in the list), I wasn't too bothered if the item essentially appeared twice in there.

So my work-around was the following.

I changed the code behind to the following, so that the item was added to the DropDownList on execution of the Load Event code and then selected :

var = GlobalScript.CountDatabaseRecords("SELECT [nationality] FROM [tbl_people] INNER JOIN [tbl_lkup_nationality] AS nationality ON [nationality] = [nationality_id] WHERE [person_id] ='" + Session["ID"] + "'");
drpNationality.Items.Add(var);
drpNationality.Text = var;

But in order for the item which was chosen in the code-behind to stay once the page is fully loaded and not be overwritten by the DataSource, you must change the HTML to the following :

<label>Nationality:</label>
<asp:DropDownList ID="drpNationality" runat="server" DataSourceID="Nationality_Datasource" DataTextField="nationality_desc" DataValueField="nationality_id" AppendDataBoundItems="True">
</asp:DropDownList>

Now, when the page is loaded, the value from the database should be pre-selected in the drop down, and all the DataSource items should also be added.

Hope this helps.

like image 28
chrismason954 Avatar answered Oct 16 '22 15:10

chrismason954