Asp.net

有一個無效的 SelectedValue,因為它不存在於項目列表中。你如何調試?

  • February 18, 2022

我在將 asp.net 綁定到下拉列表時遇到問題,我不知道如何調試。我在堆棧上查看了有關此問題的其他問題,但沒有任何幫助。據我所知,它應該選擇的“名稱”在列表中。

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

以下是錯誤

System.ArgumentOutOfRangeException 未被使用者程式碼處理 Message=‘dd1’ 有一個無效的 SelectedValue,因為它不存在於項目列表中。參數名稱:值 Source=System.Web ParamName=value StackTrace:在 System.Web.UI.WebControls.ListControl.PerformDataBinding(IEnumerable dataSource) 在 System.Web.UI.WebControls.ListControl.OnDataBinding(EventArgs e) 在 System.Web .UI.WebControls.ListControl.PerformSelect() 在 System.Web.UI.WebControls.BaseDataBoundControl.DataBind() 在 System.Web.UI.Control.DataBindChildren() 在 System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)在 System.Web.UI.Control.DataBind() 在 System.Web.UI.Control.DataBindChildren() 在 System.

傳遞給 SelectedValue 屬性的來自 的值<%# Bind("Name") %>與其集合中的項目不匹配。最可能的原因:

  • DropDownList 沒有項目,因為評估發生在列表綁定之前
  • 該列表已綁定,但缺少此特定值
  • 返回的值可能為 null

我意識到這是一個舊執行緒,但Google將此作為解決此問題的第一個選項 - 使用相當通用的搜尋詞。

無論如何,我遇到的問題以及解決方法如下。就像 Brian Mains 所說的那樣,問題將會出現,原因如下:

  • DropDownList 沒有項目,因為評估發生在列表綁定之前
  • 該列表已綁定,但缺少此特定值
  • 返回的值可能為 null

我遇到的問題,即使不是很清楚,因為我在使用相同方法的其他一些 DropDowns 上沒有收到錯誤,是在載入頁面時,我試圖使用此程式碼-behind 向 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"] + "'");

這是 DropDown HTML(其中包含由數據源填充的項目):

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

現在,我遇到的問題是在載入時數據沒有綁定到控制項,當我試圖在程式碼中添加項目時。因為我試圖在啟動時為使用者從數據庫中預先選擇一個值(它確實存在於列表中),所以如果該項目基本上在那裡出現了兩次,我不會太在意。

所以我的解決方法如下。

我將後面的程式碼更改為以下程式碼,以便在執行載入事件程式碼時將該項目添加到 DropDownList 中,然後選擇:

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;

但是為了在頁面完全載入後保留在程式碼隱藏中選擇的項目並且不被數據源覆蓋,您必須將 HTML 更改為以下內容:

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

現在,當頁面載入時,應該在下拉列表中預先選擇數據庫中的值,並且還應該添加所有 DataSource 項。

希望這可以幫助。

引用自:https://stackoverflow.com/questions/14654220