none
dropdownlistでの、負の数の取得について RRS feed

  • 質問

  • いつも、読ませていただいております。

    dropdownlistで、負の数の取得しようとしても、目的の値を取得しません。
    何が問題になっているのでしょうか。

    DBの方は、sql2000で、smallintを使用しています。

    <asp:dropdownlist runat="server" name="select_01" size="1" ID="select_01">
                    <asp:ListItem value="0">0</asp:ListItem>
                    <asp:ListItem value="-1">-1</asp:ListItem>
                    <asp:ListItem value="1">1</asp:ListItem>
                  </asp:dropdownlist>

    また参考に、nullを書き込むことはできるのでしょうか。
    よろしくお願いします。

     

    2006年10月4日 8:23

回答

  •  てしてし さんからの引用

    やはり、forで回すパターンだとうまくいきません。

    どのようなエラーが出ているのかを聞いておくべきでした。取得できないということなので、エラーが出ていないと思い込んでしまっていましたが、ひょっとして、以下のエラーメッセージが表示されますか?

      DropDownList で複数項目が選択されるように指定できません。

    であれば、以下のようにして下さい。

    for i_01 = 0 to select_01.Items.count -1
        If select_01.Items(i_01).Text = objDBReader.Item("フィールド名").ToString().Trim() Then
           select_01.Items(i_01).Selected = True
      Else
           select_01.Items(i_01).Selected = False
        End If
    next

     てしてし さんからの引用

    一方SelectedValue を使用したい場合、もとのDBの値がnullだと、

    指定された引数は、有効な値の範囲内にありません

    との、エラーが出ます。


    IsDBNullで判断して下さい。
     
     てしてし さんからの引用

    それでは、
       If Session("select01") = "" Then
                Session("select01") = DBNull.Value
            Else
                Session("select_01") = select_01.SelectedValue
            End If

    などで、html上の空文字を DBNull.Valueとして、代入することはできたのですが、この場合は、DBには、0が挿入されてしまいます。
    (SQLテーブルはnull許可にしてあります。)


    どのようなコードで保存されていますか? Nullを保存したい場合、例えば次のようにします。

    Dim sqlCmd As SqlCommand = New SqlCommand("update TEST set TEST1 = @TEST1 where TESTID=@hoge", sqlConn)

    sqlCmd.Parameters.AddWithValue("@TEST1", DBNull.Value)
    sqlCmd.Parameters.AddWithValue("@hoge", 更新したいレコードのTESTID)

     てしてし さんからの引用

    また、仮にnullがDBに挿入できた場合、html上のvalueでは、nullをどのように取得すればよいのでしょうか。

    先ほども書きましたが、nullかどうかはIsDBNull関数で判断できます。例えばこんな感じです。

    If IsDBNull(sqlReader("TEST1")) Then

    2006年10月6日 2:52
    モデレータ

すべての返信

  • 提示されているのは0、-1、1を選択できるドロップダウンリストのソースですが、ここで選択したときの処理はどう記述されているのでしょうか。
    また、データベースとはどのように関係させているのでしょうか。

    もしこのとおりの記述しかないなら、ドロップダウンリストで選択したときになにも起きないのは当然だと思います。

     

    2006年10月4日 8:44
  • 早速の返信ありがとうございます。

    データの取得は、フィールド等宣言のあとに

                        Dim i_01 as integer                 
                        for iiAb1x_01 = 0 to select_01.Items.count -1
                        If select_01.Items(i_01).Text = objDBReader.Item("フィールド名").ToString().Trim() Then
                            select_01.Items(i_01).Selected = True
                        End If
                        next

    書き込みは、一度sessionに入れたあと、updateSQLで実行しています。

    なお正(+)の値は、正常に更新されています。

    よろしくお願いします。

    2006年10月4日 8:58
  • うーん、提示される情報がなんか中途半端だなぁ。。。

    どこができなくて悩まれているのでしょう。
    データベースに-1が入っているのにドロップダウンリストにうまく設定できないのでしょうか。
    それとも、ドロップダウンリストで-1を設定したときデータベースがうまく更新できないのでしょうか。
    どちらで悩んでいる場合でもいいですけど、自分が思ったとおりの値が受け渡しされているかどうかデバッグの途中で止めるなどして動作を確かめているのでしょうか。

    なんか、とりあえずプログラム書いたのが思ったとおりに動かない、という時点で調べもせずに聞いてませんか?

     

    2006年10月4日 9:48
  • >データベースに-1が入っているのにドロップダウンリストにうまく設定できないのでしょうか。
    >それとも、ドロップダウンリストで-1を設定したときデータベースがうまく更新できないのでしょうか。
    データベースに更新はするのですが、次にドロップダウンリストが読みに行ったときに、先頭のアイテム(0)が表示されてしまいます。

    正の数の時は、目的の値をドロップダウンリストが指します。

    >どちらで悩んでいる場合でもいいですけど、自分が思ったとおりの値が受け渡しされているかどうかデバッグの途中で止めるなどして動作を確かめているのでしょうか。
    >
    なんか、とりあえずプログラム書いたのが思ったとおりに動かない、という時点で調べもせずに聞いてませんか?

     やっとレファレンス等参照しながら書いて確認しながら質問しているのですが、
    こう書かれてしまうと、初心者は質問が出しにくいですね。

    ちなみに、nullをvalueに代入すると、0がDBに更新されてしまいます。

     

    2006年10月4日 11:16
  •  てしてし さんからの引用

       Dim i_01 as integer                
       for iiAb1x_01 = 0 to select_01.Items.count -1
           If select_01.Items(i_01).Text = objDBReader.Item("フィールド名").ToString().Trim() Then
               select_01.Items(i_01).Selected = True
           End If
       next

    は、

       for i_01 = 0 to select_01.Items.count -1

    の誤りですよね? これ以外は誤っていないので、-1でもうまくいくはずです。
    objDBReader.Item("フィールド名").ToString().Trim()が本当に-1になっているのか確かめてみられたらいかがでしょうか?(どっとねっとふぁんさんも言われてますが)

    また、上記のコードは簡単に、

    select_01.SelectedValue = objDBReader.Item("フィールド名").ToString().Trim()

    で、いいと思います。

    あと、データベースへnull値の書き込みですが、DBNull.Valueを書き込んであげればOKです。

    2006年10月4日 15:21
    モデレータ
  • えっと、プログラムは書き込まれたとおりの記述でしょうか。
    書き込んだときに転記ミスとかしてないですよね。
    だとしたら、これで動くほうがおかしいような。。。

    iiAb1x_01 はどこで使ってるんでしょう。i_01 の間違い???

    > こう書かれてしまうと、初心者は質問が出しにくいですね。

    質問の仕方をよく考えてみてください。
    一番最初の質問にたいして、そのままで答えを指摘できる人がいると思いますか?
    あなたが書いたプログラムはほかの人には見えません。
    また、あなたがどこでつまっているかもほかの人にはわかりません。
    私のほうで2回逆に質問して、やっとはじめてどういったところをチェックすればいいのかが見えてきたところだと思います。

    また、自分でデバッグしているのであれば、おかしいところでどういった値がはいっているかといったチェックは普通しますよね。VSにはそのための機能もあるんですし。
    それをやっていれば、上記のようなプログラムミス(に思える。すくなくともここに書き込まれた限りの情報からは)はその時点で見つけられるんじゃないですかね。

     

    2006年10月4日 15:34
  • みなさま、返信ありがとうございます。

    >for i_01 = 0 to select_01.Items.count -1 の誤りですよね?
    >これ以外は誤っていないので、-1でもうまくいくはずです。
    確かにここは、間違っておりました。すみません。
    しかし、直してもやはり正しく取得しませんでした。

    >また、上記のコードは簡単に、
    >select_01.SelectedValue = objDBReader.Item("フィールド名").ToString().Trim()
    >で、いいと思います。
    こちらに直したら、正しく取得しました。

    >あと、データベースへnull値の書き込みですが、DBNull.Valueを書き込んであげればOKです。
    これは、どこにDBNull.Valueを記述すればよいのでしょうか。

    <asp:dropdownlist runat="server" name="select_01" size="1" ID="select_01">
                    <asp:ListItem value="0">0</asp:ListItem>
                    <asp:ListItem value="-1">-1</asp:ListItem>
                    <asp:ListItem value="DBNull.Value">空欄</asp:ListItem>
                  </asp:dropdownlist>

    このような書き方では、だめでした。
    また、vbで記述した場合、nullの取得の方は、どのようにvalueを書けばよいのでしょうか。

    2006年10月5日 2:37
  •  てしてし さんからの引用

    >for i_01 = 0 to select_01.Items.count -1 の誤りですよね?
    >これ以外は誤っていないので、-1でもうまくいくはずです。
    確かにここは、間違っておりました。すみません。
    しかし、直してもやはり正しく取得しませんでした。

    >また、上記のコードは簡単に、
    >select_01.SelectedValue = objDBReader.Item("フィールド名").ToString().Trim()
    >で、いいと思います。
    こちらに直したら、正しく取得しました。


    ということであれば、objDBReader.Item("フィールド名").ToString().Trim()で正しく"-1"が取得できていそうですね。でれば、forで回すパターンでもうまく行きそうなんですが・・・。

     てしてし さんからの引用

    <asp:dropdownlist runat="server" name="select_01" size="1" ID="select_01">
                    <asp:ListItem value="0">0</asp:ListItem>
                    <asp:ListItem value="-1">-1</asp:ListItem>
                    <asp:ListItem value="DBNull.Value">空欄</asp:ListItem>
                  </asp:dropdownlist>

    このような書き方では、だめでした。
    また、vbで記述した場合、nullの取得の方は、どのようにvalueを書けばよいのでしょうか。


    上のコードはhtml上での話になってしまい、DBNull.Valueという文字列を受け渡すにすぎません。テーブルに保存しに行く時に、上の場合でしたら、SelectedValue が DBNull.Value という文字列であれば、DBNull.Valueを保存するif文を追加して下さい。
    つまり、SelectedValueで得られるDBNull.ValueはString型の単なる文字列なので、これをテーブルに保存する場合には、DBNullクラスのValue値を保存しなければならないということです。

    2006年10月5日 4:16
    モデレータ
  • みなさま、返信ありがとうございます。
    日々、勉強させていただいております。

     てしてし さんからの引用

    >for i_01 = 0 to select_01.Items.count -1 の誤りですよね?
    >これ以外は誤っていないので、-1でもうまくいくはずです。
    確かにここは、間違っておりました。すみません。
    しかし、直してもやはり正しく取得しませんでした。

    >また、上記のコードは簡単に、
    >select_01.SelectedValue = objDBReader.Item("フィールド名").ToString().Trim()
    >で、いいと思います。
    こちらに直したら、正しく取得しました。


    >ということであれば、objDBReader.Item("フィールド名").ToString().Trim()で正しく"-1"が取得できていそうですね。でれば、forで回すパターンでもうまく行きそうなんですが・・・。

    やはり、forで回すパターンだとうまくいきません。
    一方SelectedValue を使用した場合、もとのDBの値がnullだと、

    指定された引数は、有効な値の範囲内にありません

    との、エラーが出ます。

     

    >上のコードはhtml上での話になってしまい、DBNull.Valueという文字列を受け渡すにすぎません。テーブルに保存しに行く時に、上の場合でしたら、SelectedValue が DBNull.Value という文字列であれば、DBNull.Valueを保存するif文を追加して下さい。
    >つまり、SelectedValueで得られるDBNull.ValueはString型の単なる文字列なので、これをテーブルに保存する場合には、DBNullクラスのValue値を保存しなければならないということです。

    それでは、
       If Session("select01") = "" Then
                Session("select01") = DBNull.Value
            Else
                Session("select_01") = select_01.SelectedValue
            End If

    などで、html上の空文字を DBNull.Valueとして、代入することはできたのですが、この場合は、DBには、0が挿入されてしまいます。
    (SQLテーブルはnull許可にしてあります。)

    また、仮にnullがDBに挿入できた場合、html上のvalueでは、nullをどのように取得すればよいのでしょうか。

    みなさま、よろしくお願いします。

     

    2006年10月5日 8:00
  •  てしてし さんからの引用

    やはり、forで回すパターンだとうまくいきません。

    どのようなエラーが出ているのかを聞いておくべきでした。取得できないということなので、エラーが出ていないと思い込んでしまっていましたが、ひょっとして、以下のエラーメッセージが表示されますか?

      DropDownList で複数項目が選択されるように指定できません。

    であれば、以下のようにして下さい。

    for i_01 = 0 to select_01.Items.count -1
        If select_01.Items(i_01).Text = objDBReader.Item("フィールド名").ToString().Trim() Then
           select_01.Items(i_01).Selected = True
      Else
           select_01.Items(i_01).Selected = False
        End If
    next

     てしてし さんからの引用

    一方SelectedValue を使用したい場合、もとのDBの値がnullだと、

    指定された引数は、有効な値の範囲内にありません

    との、エラーが出ます。


    IsDBNullで判断して下さい。
     
     てしてし さんからの引用

    それでは、
       If Session("select01") = "" Then
                Session("select01") = DBNull.Value
            Else
                Session("select_01") = select_01.SelectedValue
            End If

    などで、html上の空文字を DBNull.Valueとして、代入することはできたのですが、この場合は、DBには、0が挿入されてしまいます。
    (SQLテーブルはnull許可にしてあります。)


    どのようなコードで保存されていますか? Nullを保存したい場合、例えば次のようにします。

    Dim sqlCmd As SqlCommand = New SqlCommand("update TEST set TEST1 = @TEST1 where TESTID=@hoge", sqlConn)

    sqlCmd.Parameters.AddWithValue("@TEST1", DBNull.Value)
    sqlCmd.Parameters.AddWithValue("@hoge", 更新したいレコードのTESTID)

     てしてし さんからの引用

    また、仮にnullがDBに挿入できた場合、html上のvalueでは、nullをどのように取得すればよいのでしょうか。

    先ほども書きましたが、nullかどうかはIsDBNull関数で判断できます。例えばこんな感じです。

    If IsDBNull(sqlReader("TEST1")) Then

    2006年10月6日 2:52
    モデレータ