asp.net 具有无效的SelectedValue,因为它不存在于项列表中,如何调试?

fcwjkofz  于 2023-01-03  发布在  .NET
关注(0)|答案(9)|浏览(208)

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>

以下是错误
用户代码未处理System. ArgumentOutOfRangeException Message ='dd1 '具有无效的SelectedValue,因为它在项列表中不存在。参数名:value源=系统. Web参数名称=值堆栈跟踪:位于系统. Web.用户界面. Web控件.列表控件.执行数据绑定(IEnumerable数据源)位于系统. Web.用户界面. Web控件.列表控件. OnDataBinding(事件参数e)位于系统. Web.用户界面. Web控件.列表控件.执行选择()位于系统. Web.用户界面. Web控件.基础数据绑定控件.数据绑定()位于系统. Web.用户界面.控件.数据绑定子级()位于系统. Web.用户界面.控件.数据绑定(布尔值raiseOnDataBinding)位于系统. Web.用户界面.控件.数据绑定()位于系统. Web.用户界面.控件.数据绑定子级()位于系统. Web.用户界面.控件.数据绑定(布尔值raiseOnDataBinding)位于系统. Web.用户界面.控件.数据绑定()位于系统. Web.用户界面.控件.数据绑定子级()位于系统. Web.用户界面.控件.数据绑定(布尔值raiseOnDataBinding)位于系统. Web.用户界面.控件.数据绑定()位于系统. Web.用户界面.控件.数据绑定子级()位于系统. Web.用户界面.控件.数据绑定(布尔值raiseOnDataBinding)位于系统. Web.用户界面. Web控件.详细信息视图.创建子控件(IEnumerable数据源,布尔数据绑定)在系统. Web. UI. Web控件.复合数据绑定控件.执行数据绑定(IEnumerable数据)位于系统. Web.用户界面. Web控件.详细信息视图.性能数据绑定(IEnumerable数据)位于系统. Web.用户界面. Web控件.数据绑定控件. OnDataSourceViewSelectCallback(IEnumerable数据)。请选择(数据源选择参数参数,数据源视图选择回调回调)在系统. Web.用户界面. Web控件.数据绑定控件.执行选择()位于系统. Web.用户界面. Web控件.基础数据绑定控件.数据绑定()位于系统. Web.用户界面. Web控件.详细信息视图.数据绑定()位于存储更新. GvStoresSelect_选定索引已更改(对象发送方,EventArgs e),位于系统.事件处理程序.调用的第233行(对象发送方,事件参数e),位于系统. Web.用户界面. Web控件.网格视图. OnSelectedIndexChanged(事件参数e)位于系统. Web.用户界面. Web控件.网格视图.句柄选择(Int32行索引),位于系统. Web.用户界面. Web控件.网格视图.处理事件(事件参数e、布尔原因验证、字符串验证组),位于系统. Web. UI. Web控件.网格视图. OnBubbleEvent(对象源,事件参数e),位于系统. Web.用户界面.控件. RaiseBubbleEvent(对象源,EventArgs参数),位于System. Web. UI. WebControls. GridViewRow. OnBubbleEvent(对象源,事件参数e),位于系统. Web.用户界面.控件. RaiseBubbleEvent(对象来源,事件参数参数)位于系统. Web.用户界面. Web控件.链接按钮. OnCommand(命令事件参数)位于系统. Web.用户界面. Web控件.链接按钮.启动回发事件(字符串事件参数),位于系统。Web。UI。Web控件。链接按钮。系统。Web。UI。IPostBackEvent处理程序。(字符串事件参数),位于System. Web. UI. Page中。(IPostBackEventHandler源控件,字符串事件参数)在System.Web.UI.Page.RaisePostBackEvent中(名称值集合postData)。ProcessRequestMain(布尔值包括异步点之前的阶段,布尔值包括异步点之后的阶段)内部异常:

rkue9o1l

rkue9o1l1#

传递给SelectedValue属性的来自<%# Bind("Name") %>的值与其集合中的项不匹配。最可能的原因是:

  • DropDownList没有项,因为求值发生在绑定列表之前
  • 列表已绑定,但缺少此特定值
  • 返回的值可能为空
lbsnaicq

lbsnaicq2#

DataBind很臭,我尝试了所有提到的建议,没有一个起作用,最后把SelectedValue设置为null,清除所有项(myDDL.Items.Clear()),然后迭代我的列表并手动添加新的ListItems -myDDL.Items.Add(new ListItem(myListEntry.Text,myListEntry.Value))

xkrw2x1b

xkrw2x1b3#

我知道这是一个老线索,但谷歌提出了这个问题的第一个选择-与一个相当通用的搜索词。
不管怎样,我在这方面遇到的问题和我解决它的方法如下。问题要么会出现,就像布莱恩·梅恩斯说的,原因如下:

  • DropDownList没有项,因为求值发生在绑定列表之前
  • 列表已绑定,但缺少此特定值
  • 返回的值可能为空

我遇到的问题,即使它不是很清楚,因为我没有得到错误的一些其他DropDowns我正在使用相同的方法,是在页面加载时,我试图使用这个代码隐藏添加一个项目到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>

现在,我遇到的问题是,在加载时,当我试图在代码中添加项目时,数据还没有绑定到控件。因为我试图在启动时为用户从数据库中预先选择一个值(列表中确实存在),所以如果项目实际上在列表中出现两次,我也不会太烦恼。

    • 所以我的解决方案如下**

我将后面的代码更改为以下代码,以便在执行Load Event代码时将该项添加到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项。
希望这个有用。

nnvyjq4y

nnvyjq4y4#

我遇到了同样的问题。事情是这样的。我最初设置的值不在下拉列表中。如果您最初设置的值不在您希望在下拉列表中显示的值中,则它将不起作用。例如,如果您最初在数据中有Fred,则需要在该下拉列表中有Fred。

k2fxgqgv

k2fxgqgv5#

如果在分配数据源之前为下拉控件Text属性分配了任何值,则会发生此错误。
示例:

StatusDropDown.Text = "some value";
StatusDropDown.DataSource = statusDatatable;

在执行第2行时,您将得到该错误。

q8l4jmvw

q8l4jmvw6#

在我的例子中,清除下拉列表的方法最初设置为ddlname.text = string.empty
我将其重置为ddlname.items.clear(),这解决了错误。

wh6knrhe

wh6knrhe7#

我遇到了一个类似的问题-基本问题是我的RadioButtonList引用的底层SQL数据库字段的格式。我将DB字段从NCHAR转换为VARCHAR...我认为NCHAR向字段添加了额外的内容,这在RadiolButton求值时引发了错误。您可能必须删除并加载作为NCHAR放入VARCHAR的数据。这对我有效。希望对您有效。

bis0qfac

bis0qfac8#

在将下拉列表与数据绑定列表中没有的值进行数据绑定之前,请检查是否正在设置下拉列表的值。
在我的例子中,我用"ABC"设置了dropdown的值,而我绑定的列表只有{"1", "2", "3" ,"4"}的值

suzh9iv8

suzh9iv89#

我在绑定数据源之前添加了额外的blow代码,解决了同样的问题:

ddl.Items.Insert(0, "");
ddl.SelectedValue = "";
ddl.DataSource = null;
ddl.DataBind();

当dropdownlist得到一个选中的值时(不管什么原因),我尝试插入一个新值(这里是一个 * 空字符串 *)并将其设置为选中的值,然后用 null 值绑定来刷新数据源,这样就解决了这个问题。

相关问题