none
DropDownListでNULLを選択表示について RRS feed

  • 質問

  • こんにちわ。また教えて下さい。

    あるテーブルに下記のようなデータが入っています。


    製品コード 製品名 担当者コード
    0000    いちご   1001
    0001    りんご   1002
    0002    バナナ   NULL
    0004    みかん   1001
    0005    もも     NULL
    ....

     

    DropDownList1に担当者コードをDISTINCTを使って重複するものは単一表示にし、表示します。

    その選択した担当者コードによって担当している製品名を絞り込んでDropDownList2に表示したいと思っています。

     

    DropDownList1で、担当者コード1001を選択したら、DropDownList2でいちごとみかんを表示するように作成しました。

    そして担当者コードがNULLを選択したときも、製品名を表示したいのですが、NULLを選択した場合だけ、DropDownList2には何も表示されなくなってしまいます。

     

    担当者コードでNULLを選択したときも製品名を表示できるようにしたいのですが、それは可能なのでしょうか?

    わかりにくい質問かと思いますが、ご不明な点はお聞き下さい。


    VBで、Visual Studio2005です。

    どなたかご存じの方がいらっしゃいましたらお願い致します。

     

    2008年8月22日 0:07

回答

  • 担当者コードにNULLを選択したつもりが、空白になっているのではないでしょうか? もしくはDBNull.Valueを渡さなければならないところに、NULLを渡しているのではないでしょうか?

    2008年8月22日 0:38
    モデレータ
  • SqlDataSource を使うと何が起こってるのか難しいですね。
    プロファイラでどのような SQL が発行されているか見たらどうでしょうか。NULL だとどうなるんでしょうね。

     

    2008年8月22日 1:42
  • 「TextData」って何の事を指してるのかわかりませんが、

    SELECT * FROM [seihindb] WHERE ([shaincode] = @shaincode)

    の @shaincode に何も入っていなかったってことでしょうか?NULLを選んだときは、上記はどういう SQL になっているんでしょうか?
    もし、期待した SQL になっていないなら、SqlDataSource ではなく、ObjectDataSource を使ってはどうでしょうか。

     

     

    2008年8月22日 7:40
  •  trapemiya さんからの引用

    担当者コードにNULLを選択したつもりが、空白になっているのではないでしょうか? もしくはDBNull.Valueを渡さなければならないところに、NULLを渡しているのではないでしょうか?

     

    DB が NULL のときは DropDownList (d_shaincode) の SelectedValue が DBNull.Value
    ではなく空白 (String.Empty) になるようですが、と言って空白に替えて DBNull.Value
    を渡しても期待通りにはならないように思うのですが・・・

     

    DBNull.Value を渡すには、SqlDataSource (sds2) の Selecting イベントのハンドラで、

     

    e.Command.Parameters["@shaincode"].Value = DBNull.Value;

     

    とすれば可能と思いますが、それで DropDownList (d_seihin) に「バナナ」と「もも」
    が表示されることはないと思いますが・・・ (一応サンプルを作って検証してみまし
    たが、何も選択されないと言う結果でした。)

     

    他に何か方法があるのでしょうか?

    2008年8月24日 13:34

すべての返信

  • 担当者コードにNULLを選択したつもりが、空白になっているのではないでしょうか? もしくはDBNull.Valueを渡さなければならないところに、NULLを渡しているのではないでしょうか?

    2008年8月22日 0:38
    モデレータ
  • trapemiyaさん

     

    いつもありがとうございます。

     

     

    すみません、教えて頂いたことが良く理解できず、、、(泣

     

    作成したコードなのですが、見て頂いてもよろしいでしょうか?

     

     

    こちらが社員コードを選択するDropDownListです

     

    Code Snippet


     <asp:DropDownList ID="d_shaincode" runat="server" DataSourceID="sds1" DataTextField="shaincode"
                            DataValueField="shaincode" AutoPostBack="True">
                        </asp:DropDownList>
                        <asp:SqlDataSource ID="sds1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDB %>"
                            SelectCommand="SELECT DISTINCT [shaincode] FROM [seihindb] ORDER BY [shaincode] ASC"></asp:SqlDataSource>

     

     

    こちらが製品名を選択するDropDownListです

     


    Code Snippet


    <asp:DropDownList ID="d_seihin" runat="server" DataSourceID="sds2" DataTextField="seihinmei"
                            DataValueField="seihinmei" EnableViewState="False">
                        </asp:DropDownList>
                        <asp:SqlDataSource ID="sds2" runat="server" ConnectionString="<%$ ConnectionStrings:MyDB %>"
                            SelectCommand="SELECT * FROM [seihindb] WHERE ([shaincode] = @shaincode)">
                            <SelectParameters>
                                <asp:ControlParameter ControlID="d_shaincode" Name="shaincode" PropertyName="SelectedValue"
                                    Type="String" />
                            </SelectParameters>
    </asp:SqlDataSource>

     

     


     



     よろしくお願い致します。

    2008年8月22日 0:55
  • SqlDataSource を使うと何が起こってるのか難しいですね。
    プロファイラでどのような SQL が発行されているか見たらどうでしょうか。NULL だとどうなるんでしょうね。

     

    2008年8月22日 1:42
  • 囚人さん

     

    ありがとうございます。

     

    プロファイラで見てみましたが、社員コードを選択したときに、TextDataには

    何も追加されませんでした。

     

    これはうまくSQLが送れていないことを意味しているのでしょうか?

    2008年8月22日 5:15
  • 「TextData」って何の事を指してるのかわかりませんが、

    SELECT * FROM [seihindb] WHERE ([shaincode] = @shaincode)

    の @shaincode に何も入っていなかったってことでしょうか?NULLを選んだときは、上記はどういう SQL になっているんでしょうか?
    もし、期待した SQL になっていないなら、SqlDataSource ではなく、ObjectDataSource を使ってはどうでしょうか。

     

     

    2008年8月22日 7:40
  •  trapemiya さんからの引用

    担当者コードにNULLを選択したつもりが、空白になっているのではないでしょうか? もしくはDBNull.Valueを渡さなければならないところに、NULLを渡しているのではないでしょうか?

     

    DB が NULL のときは DropDownList (d_shaincode) の SelectedValue が DBNull.Value
    ではなく空白 (String.Empty) になるようですが、と言って空白に替えて DBNull.Value
    を渡しても期待通りにはならないように思うのですが・・・

     

    DBNull.Value を渡すには、SqlDataSource (sds2) の Selecting イベントのハンドラで、

     

    e.Command.Parameters["@shaincode"].Value = DBNull.Value;

     

    とすれば可能と思いますが、それで DropDownList (d_seihin) に「バナナ」と「もも」
    が表示されることはないと思いますが・・・ (一応サンプルを作って検証してみまし
    たが、何も選択されないと言う結果でした。)

     

    他に何か方法があるのでしょうか?

    2008年8月24日 13:34
  • 囚人さん

     

    ありがとうございます。

     

    すみません、プロファイラの使い方がよくわかってないため@shaincode の中身を見ることが出来ないです。。

    また、NULLを選んでもSQLが発行されてない?のか何も表示されませんでした。

    ObjectDataSourceも試してみたのですが、私のやり方が悪いのだと思いますが、うまくできませんでした。。。

     

     

    SuferOnWwwさん

     

    ありがとうございます。

     

     

    よくわからないので、NULL項目を他のデータに変換してから使うようにしました。

     

    今回はこの方法でやってみようと思います。

     

     

    ありがとうございました。

    2008年8月25日 4:09
  • こんにちは、フォーラムオペレータ大久保です。

     

    ソルピー さん、いつもフォーラムのご利用ありがとうございます。

    原因は判明しませんでしたが、他の方法で回避できたんですね。深追いしてハマるより(私はこのパターン)そのほうがよい選択だと思います。

     

    ひとまず解決と言うことで、アドバイスをくださった皆様の投稿に「回答済み」チェックをつけさせていただきました。

    また何かありましたらフォーラムにご相談ください。

     

    それでは

    2008年9月9日 3:32
  •  ソルピー さんからの引用

    よくわからないので、NULL項目を他のデータに変換してから使うようにしました。

     

    それが正解だと思います。テーブルの設計というのは非常に重要です。テーブルを設計し、SQL文までテストした上でそれを実現するためにプログラムを作るという流れにしないと、プログラムを効率よく、かつ高品位に作成することができないと思います。まず、テーブルの設計ありきです。

    また、できるだけNULLの使用は避けた方が後々の処理が楽です。どのようなことを実現されようとして、どのようなテーブル設計をされているのでしょうか? なかなか解決にいたらないのは、この辺りに問題があるのかもしれません。つまり、テーブル構造が適切ではなく、それを元に作成するプログラムが複雑になってしまっているのかもしれません。

    2008年9月9日 4:19
    モデレータ
  • 大久保さん

    trapemiyaさん

     

    ありがとうございます。

     

     

    現在、テーブル設計は他の担当者がやっていまして、私はそのすでに出来上がったテーブル設計を

    使わせてもらっている状態なんです。

     

    なので、いろいろ設計を変更することができず、あらかじめあるものをうまく使いこなしていくしかないのです。。。

     

    なかなか難しいのですが、残念ながらこの点では今のところ改善策はありません。。

    2008年9月12日 9:52