none
FormViewの編集で、ドロップダウンリストのSelectedValueを指定するとエラーになる RRS feed

  • 質問

  • こんにちわ。

    FormView編集時、ドロップダウンリストには編集前の値を保持し、ドロップダウンリストから選択する値は

    DBからバインドしたデータを表示させたいと思っています。

    FormViewの編集(EditItem)で、ドロップダウンリストにSelectedValueを指定すると

    下記の様なエラーが表示されます。

    「項目一覧に存在しないため、'XXX'にSelectedValueを指定することは無効です。

    パラメーター名: value」

    ☆ソース(一部抜粋)--------------------------------------------------------------------------

    <asp:DropDownList ID="XXX" runat="server"

    DataSourceID="SqlDataSource1" DataTextField="〇〇〇" DataValueField="△△△"

    SelectedValue='<%#Bind("□□□") %>'></asp:DropDownList>

    <asp:SqlDataSource ID="SqlDataSource1" runat="server"

    ConnectionString="<%$ ConnectionsStrings:ConnectionString %>"

    SelectCommand="SELECT id,name FROM SampleTbl">

    </asp:SqlDataSource>

    ------------------------------------------------------------------------------------------

    下記の”EDIT時のDtailsViewにDropDownListができません”という件に似ていますが

    FormViewのドロップダウンリストのDataBoundの書き方(VB)がわからないので教えていただけないで

    しょうか。

    http://social.msdn.microsoft.com/Forums/ja-JP/7973d6d7-f61c-4a58-921a-588e82d65cc7/editdtailsviewdropdownlist?forum=vwdexpressja

    よろしくおねがいします。


    mai akiyama


    2014年4月22日 5:09

回答

  • NULL に対応する前に LEFT OUTER JOIN で本当に望む結果が得られているか確認してください。INNER JOIN にすべきかもしれません。

    LEFT OUTER JOIN で OK で NULL があるのが望む結果であれば、DropDownList に、

    <asp:ListItem Value="">空白</asp:ListItem>

    を追加して、DropDownList で AppendDataBoundItems="True" と設定すればうまく行きそうな気がします。お試しください。
    • 回答としてマーク あきまい 2014年4月24日 0:23
    2014年4月23日 15:45

すべての返信

  • > DataSourceID="SqlDataSource1" DataTextField="〇〇〇" DataValueField="△△△"
    > SelectedValue='<%#Bind("□□□") %>'></asp:DropDownList>

    上記のコードで 〇〇〇、△△△、□□□ のところは実際どうなっているんですか?

    テーブル SampleTbl の一覧を表示したいなら、DataTextField="name" DataValueField="id" となるはずです。

    エラーメッセージは、id の一覧の中に <%#Bind("□□□") %> に該当するものがないと言ってます。□□□ は FormView のデータソース中の項目の id に該当するものになるはずですが、そのへんの関係に間違いがあるのでは?

    上記のヒントで分からなければ、FromView を含めて、差し障りない範囲でコードをアップしてください。


    PS.コードは、入力ウィンドウの上にある「コードブロックの表示」アイコン(右から二つ目)をクリックして、それに入力してください。
    • 編集済み SurferOnWww 2014年4月22日 6:37 一部修正
    2014年4月22日 6:29
  • SurferOnWwwさま

    早速のご回答ありがとうございます。

    >上記のコードで 〇〇〇、△△△、□□□ のところは実際どうなっているんですか?

    <EditItemTemplate>
    <asp:DropDownList ID="スタンプddl" runnat="server"
    DataSourceID="SqlDataSource1" DataTextField="スタンプ名称" DataValueField="スタンプ番号" AppendDataBoundItems="true"
    SelectedValue='<%#Bind("スタンプ") %>'></asp:DropDownList>
    </EditItemTemplate>
    
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
    SelectCommand="SELECT [スタンプ番号],[スタンプ名称] FROM [スタンプテーブル] ">

    <スタンプテーブル>

    スタンプ番号 | スタンプ名称

    --------------------------------------------------

    01              |  OK

    02        |  NG

    03              |   祝

                     :

    以上のようになっていて、たとえばドロップダウンリストの「OK」を選択した場合は

    FormViewのスタンプに「01」が設定されるイメージです。

    ちなみに、FormViewのスタンプに設定した「01」は、スタンプテーブルに存在しています。

    >。□□□ は FormView のデータソース中の項目の id に該当するものになるはずですが、そのへんの関係に間違いがあるのでは?

    ドロップダウンリストではなくて、普通のテキストボックスの場合は、FormViewのスタンプに編集前のスタンプ番号がちゃんとバインドされていました。

    やはりDataBoundのようなコードを書かないといけないのでしょうか?

    よろしくお願いします。


    mai akiyama



    2014年4月22日 7:31
  • FormView とそのデータソース(SqlDataSource ですか?)を含めたコードをアップできませんか。こちらではそのあたりが見えないと分からないです。

    あと、ご自分の環境(OS, .NET, IIS, Visual Studio, SQL Server などのバージョン)を書いてください。

    【追伸】

    > やはりDataBoundのようなコードを書かないといけないのでしょうか?

    いえ、何か特別な事情がなけれれば、ウィザードを使って、一行も自分ではコードをかかずにできるはずです。

    • 編集済み SurferOnWww 2014年4月22日 10:07 追伸追加
    2014年4月22日 8:39
  • SurferOnWww さま

    返信ありがとうございます。

    データソースはSqlDataSource です。いま、コードは整理してますので、のちほどアップします。

    自分の環境は以下の通りです。

    Windows 7 Professional ServicePack1 (IIS 7.5)

    ASP.NET4.0 / VisualBasic

    Microsoft Visual Web Developer 2010 Express

    Microsoft SQL Server 2008  Express ServicePack1


    mai akiyama

    2014年4月23日 4:24
  • テーブルの構成は、品目リスト、スタンプテーブルの2つになります。

    ☆品目リスト

    ☆スタンプテーブル


    mai akiyama

    2014年4月23日 9:40
  • エラーの画面は下記のようになります。


    mai akiyama

    2014年4月23日 9:42
  • コードをアップしてすぐ消しましたね?

    アップして消したコードを見ると、SqlDataSource1 の SelectCommand で LEFT OUTER JOIN を使ってますけど、そのあたりに問題がありそうな気がします。結果、SelectedValue='<%# Bind("スタンプ名称")  %>' のスタンプ名称に NULL が含まれることになりませんか?

    2014年4月23日 10:11
  • SurferOnWww さま

    実は質問用に書き直したコードだと問題なく動いてしまったので、一度アップしたのですが消してしまいました。すみません。いま、問題が発生しているコードのSQLとスタンプ名称にNULLがないか再度見直してみます。


    mai akiyama

    2014年4月23日 10:20
  • LEFT OUTER JOIN でどういう結果になるかよく調べてください。
    2014年4月23日 12:07
  • SurferOnWwwさま

    ご指摘のとおり、'<%# Bind("スタンプ名称")  %>' のスタンプ名称に NULL が含まれていたので

    (品目リストのスタンプ番号がNULL(空文字)の場合)、今回のエラーが発生することがわかりました。

    スタンプ名称がNULLの場合でも、ドロップダウンリストを表示させるにはどうすればいいのでしょうか??

    よろしくお願いします。


    mai akiyama

    ■追記

    もしコードが必要であればアップします。

    2014年4月23日 14:56
  • NULL に対応する前に LEFT OUTER JOIN で本当に望む結果が得られているか確認してください。INNER JOIN にすべきかもしれません。

    LEFT OUTER JOIN で OK で NULL があるのが望む結果であれば、DropDownList に、

    <asp:ListItem Value="">空白</asp:ListItem>

    を追加して、DropDownList で AppendDataBoundItems="True" と設定すればうまく行きそうな気がします。お試しください。
    • 回答としてマーク あきまい 2014年4月24日 0:23
    2014年4月23日 15:45
  • SurferOnWwwさま

    ご回答ありがとうございます。教えていただいたとおり修正しましたら、無事動きました。

    どうもありがとうございました!とても助かりました!!

    <asp:DropDownList ID="スタンプ名称DropDownList" runat="server" DataSourceID="SqlDataSource2" DataTextField="スタンプ名称" DataValueField="スタンプ名称" AppendDataBoundItems="true" SelectedValue='<%# Bind("スタンプ")  %>'>
    <asp:ListItem Value=""> </asp:ListItem>
    </asp:DropDownList>


    mai akiyama


    2014年4月24日 0:22