web-dev-qa-db-ja.com

アイテムのリストに存在しないため無効なSelectedValueがあります。どのようにデバッグしますか?

ドロップダウンリストへの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: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) System.Web.UI.Control.DataBind()でSystem.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)でSystem.Web.UI.Control.DataBindChildren()でSystem.Web.UI.Control.DataBind()で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() System.Web.UI.WebContでSystem.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)でSystem.Web.UI.WebControls.DetailsView.CreateChildControls(IEnumerable dataSource、Boolean dataBinding)でSystem.Web.UI.WebControls.DetailsView.PerformDataBinding(IEnumerable data)at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data)at System.Web.UI.DataSourceView。でrols.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) System.Web.UI.WebControls.BaseDataBoundControl.DataBind()のSystem.Web.UI.WebControls.DetailsView.DataBind()のSystem.Web.UI.WebControls.DataBoundControl.PerformSelect()でSelect(DataSourceSelectArguments arguments、DataSourceViewSelectCallback callback) System.Web.UI.WebControls.GridView.OnSelectedIndexChanged(EventArgs e)のSystem.WebHandler.Invoke(Object sender、EventArgs e)の233行目のstoreUpdate.GvStoresSelect_SelectedIndexChanged(Object sender、EventArgs e)でSystem.Web.UIの。 System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source、System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e、Boolean causeValidation、String validationGroup)のWebControls.GridView.HandleSelect(Int32 rowIndex) EventArgs e)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(オブジェクトソース、EventArgs args)System.Web.UI.WebControls.LinkBut​​ton.OnCommand(CommandEventArgs e)at System.Web.UI.WebControls.LinkBut​​ton.RaisePostBackEvent(String eventArgument)at System.Web.UI.WebControls.LinkBut​​ton.System System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)のSystem.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl、String eventArgument)の.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)System.Web.UI。 Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint、Boolean includeStagesAfterAsyncPoint)InnerException:

7
chobo2

SelectedValueプロパティに渡される<%# Bind("Name") %>からの値が、コレクション内のアイテムと一致しません。最も考えられる原因:

  • リストがバインドされる前に評価が行われるため、DropDownListにはアイテムがありません
  • リストはバインドされていますが、この特定の値がありません
  • 返される値はnullになる可能性があります
6
Brian Mains

私はこれが古いスレッドであることを理解していますが、Googleはこれをこの問題の最初のオプションとして提示しました-かなり一般的な検索用語を使用しています。

とにかく、これで私が抱えていた問題と解決方法は次のとおりです。次の理由でブライアン・メインズが言ったように、どちらかの問題が発生します。

  • リストがバインドされる前に評価が行われるため、DropDownListにはアイテムがありません。
  • リストはバインドされていますが、この特定の値がありません
  • 返される値はnullの可能性があります

私が経験していた問題は、同じメソッドを使用していた他のいくつかのドロップダウンでエラーが発生しなかったため、あまり明確ではなかったが、ページの読み込み時に、このコードを使用しようとしていた-後ろに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"] + "'");

そして、ここにドロップダウンHTMLがあります(これには、DataSourceによって項目が設定されていました)。

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

今、私が得ていた問題は、コード動作に項目を追加しようとしたときに、データがロード時にコントロールにバインドされていなかったことでした。私はユーザーの起動時にデータベースから値を事前に選択しようとしていたので(リストに存在していました)、アイテムが本質的にそこに2回表示されても、それほど気になりませんでした。

つまり、私の回避策は次のとおりでした。

私はコードビハインドを次のように変更しました。これにより、項目は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;

ただし、コードビハインドで選択されたアイテムが、ページが完全に読み込まれた後も残り、DataSourceによって上書きされないようにするには、HTMLを次のように変更する必要があります。

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

これで、ページが読み込まれたときに、データベースからの値がドロップダウンで事前に選択されているはずです。すべてのDataSourceアイテムも追加する必要があります。 。

お役に立てれば。

4
chrismason954

DataBindの臭い。上記の提案をすべて試しましたが、どれもうまくいきませんでした。最終的にSelectedValueをnullに設定し、すべてのアイテムをクリア(myDDL.Items.Clear())してから、リストを反復処理して新しいListItemを手動で追加しました-myDDL.Items.Add(new ListItem(myListEntry.Text,myListEntry.Value))

3
David P

データソースを割り当てる前に、ドロップダウンコントロールのTextプロパティに値を割り当てた場合、このエラーが発生します。

例:

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

2行目を実行すると、そのエラーが発生します。

1
Ramasubbu

私も同じ問題を抱えていました。ここで何が起こっていたかです。私はもともと、ドロップダウンリストにない値に値を設定していました。元々あったものがドロップダウンリストに表示したい値の中にない場合、それは機能しません。たとえば、もともとフレッドがデータに含まれていた場合、そのドロップダウンリストにフレッドを含める必要があります。

1
Andy

私は同様の問題に遭遇しました-基本的な問題は、RadioButtonListによって参照される基になるSQLデータベースフィールドの形式でした。 DBフィールドをNCHARからVARCHARに変換しました... NCHARは、RadioButtonによる評価でエラーをスローしたフィールドにコンテンツを追加すると思います。 NCHARからVARCHARに入れられたデータをドロップしてロードしなければならない場合があります。これは私にとってはうまくいきました。

0
James

私の場合、ドロップダウンリストをクリアする方法は、最初は_ddlname.text = string.empty_として設定されていました。

これをddlname.items.clear()にリセットすると、エラーが解決しました。

0
user2460568