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:
The value coming from <%# Bind("Name") %>
, which is passed to the SelectedValue property, does not match an item in its collection. Most likely causes:
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With