none
DataBindの使い方 RRS feed

  • 質問

  • いつもお世話になっております。ちいと申します。

    ASP.NET3.5を使い言語はVBです。

    DataBindの使い方について質問があります。
    現在DropDownListの値をページをロードするたびにデータベースから値を検索して表示させるというしくみをつくりたいと思っています。
    SQLとDataBindを使い一つの項目はできたのですが、他の二つについてどのように書けばいいのかわからなく質問させていただきました。
    下記のやり方でいいのでしょうか?ご教授お願いいたします。

     

    コード
        Protected ds As DataSet = New DataSet()
          
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
        
            Dim setting As System.Configuration.ConnectionStringSettings = _
                 System.Configuration.ConfigurationManager.ConnectionStrings("MyDB")
           
            Using con As New SqlConnection(setting.ConnectionString)
                
          ’一個目(Ttantouテーブルにある担当者IDを検索し、表示)
                Dim da As New SqlDataAdapter("SELECT 担当者ID FROM Ttantou", con)
                da.Fill(ds, "Ttantou")
               
          ’二個目
                Dim di As New SqlDataAdapter("SELECT 顧客ID FROM Tkokyaku", con)
                di.Fill(ds, "Tkokyaku")
                
                DataBind()
        
                   End Using
        End Sub

           
        &nbsp;&nbsp; 担当者ID:<asp:DropDownList ID="t_id" runat="server"
                DataSource ="<%# ds %>"
                 DataTextField="担当者ID" DataValueField="担当者ID">
            </asp:DropDownList>         
                
          &nbsp;&nbsp; 顧客ID:&nbsp;&nbsp; &nbsp;<asp:DropDownList ID="D_k_id" runat="server"  
                DataSource="<%# ds %>"
                DataTextField="顧客ID" DataValueField="顧客ID" >
            </asp:DropDownList>   
            
            
            
          

    2010年4月5日 2:08

回答

  • > コードについてですが、デザインとコードとで色々いじってい
    > たので、自分で削除してしまったのかもしれません。

    そんないいかげんなことをされてはコードなど見る気がしなくな
    ります。他人にコードを見てもらうなら、間違いがないように細
    心の注意をすべきと自分は思いますけど。

    > AutoGenerateColumnsにTrueとFalseを入れて実行して
    > みましたが、どちらもデータが表示されました。これは変なの
    > でしょうか?

    DropDownList には AutoGenerateColumns プロパティはありませ
    ん。少しは自分で調べてから質問するようにしてください。

    > GridViewを普通の帳票のように使うことはできますか?

    GridView でできないとまでは言えませんが、少なくとも、適切
    な使い方ではないと思います。

    普通の table タグを使って表を作って、その中に DropDownList,
    Label などのサーバーコントロールを配置してはいかがですか?


    ところで、質問が表題の「DataBind の使い方」とは違う内容にな
    ってきています。表題と違う質問は、新たに別のスレッドを立て
    て、そちらでするようにお願いします(他のユーザーのことも考え
    てください)。

    表題の問題が解決していたら、このスレッドはクローズしてくだ
    さい。

    • 回答としてマーク ちい 2010年4月9日 0:34
    2010年4月8日 13:19

すべての返信

  • DataSourceにデータセットではなく、それぞれのデータテーブルを明に指定します。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年4月5日 6:51
    モデレータ
  • trapemiyaさんへ

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

    勉強不足ですみませんが、DataSourceにそれぞれのデータテーブルを明に指定するとは、
     

    DataSource ="<%# ds.Tables("Ttantou") %>"という書き方でいいのでしょうか?

    DataSetに複数のテーブルをセットしている例がないので、参照の仕方がわかりませんでした。

    お手数おかけしますが、よろしくお願いします。

     

    2010年4月5日 7:38
  • その書き方でOKです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年4月5日 9:28
    モデレータ
  • > DataSource ="<%# ds.Tables("Ttantou") %>"という書き方でいいのでしょうか?

    "Ttantou" という文字列がある場合は '<%# ... %>' にしないと ( " ではなく ' で
    囲うようにしないと)エラーになりませんか?

    (VB では問題ないということでしたら失礼しました。C# の場合は「サーバー タグが
    正しく形成されていません。」というエラーになります)

    また、DataBind するなら、DropDownList に DataBind したほうがよさそうです。今
    のコードは Page に DataBind していますが、そうすると必要のないものまで初期化
    されてしまいますので。

    それから、DataSet, SqlDataAdapter を使うより SqlDataSource を使った方が簡単
    かつ間違いがないと思います。明示的に DataBind する必要もありませんし。検討し
    てみてください。


    ところで、最初にアップしたコードを変更しましたよね? 最初のコードは ds, ai
    という 2 つの DataSet を初期化して、それぞれを da, di という別々の
    SqlDataAdapter で Fill していたと記憶しています。それなら問題なさそうな感じ
    だったのですが、最初のコードでは期待された結果にならなかったのでしょうか?

     

    2010年4月5日 12:49
  • Trapemiyaさんへ

    きちんと動きました。
    丁寧に教えていただきありがとうございました。

    2010年4月6日 0:45
  • SurferOnWwwさんへ

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

    > DataSource ="<%# ds.Tables("Ttantou") %>"という書き方でいいのでしょうか?

    >"Ttantou" という文字列がある場合は '<%# ... %>' にしないと ( " ではなく ' で
      囲うようにしないと)エラーになりませんか?

    >(VB では問題ないということでしたら失礼しました。C# の場合は「サーバー タグが
    正しく形成されていません。」というエラーになります)

    上記に対してですが、VBでは’にするとエラーになってしまいました。

    SqlDataSourceについては現在調べています。どこか参考になるサイトはありますか?

    最初にアップしたコードではWebへの接続があまりにも遅かったので、これはなにか問題があるのではと思って変更
    しました。

    2010年4月6日 0:53
  • > 上記に対してですが、VBでは’にするとエラーになってしまいました。

    そうですか? 念のため VB で実際にコードを書いて検証してみましたが C#
    の場合と同様に "<%# ds.Tables("Ttantou") %>" ではエラーでした。

    '<%# ds.Tables("Ttantou") %>' にすれば OK でしたが・・・

    > SqlDataSourceについては現在調べています。どこか参考になるサイトは
    > ありますか?

    SqlDataSource, DropDownList などをキーワードに検索すれば参考になるペ
    ージが見つかると思いますので、探してみてください。例えば、以下のペー
    ジにサンプルコードが出ています。

    SqlDataSource.Update メソッド
    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.sqldatasource.update.aspx

    > 最初にアップしたコードではWebへの接続があまりにも遅かったので、
    > これはなにか問題があるのではと思って変更しました。

    DataSet が一つか二つかの違いで「あまりにも遅かった」というほどの差
    は出ないと思います。どこかに別の原因がありそうな気がします。

    2010年4月6日 13:19
  • SurferOnWwwさんへ

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

    そうですか? 念のため VB で実際にコードを書いて検証してみましたが C#
    の場合と同様に "<%# ds.Tables("Ttantou") %>" ではエラーでした。

    '<%# ds.Tables("Ttantou") %>' にすれば OK でしたが・・・

    上記についてですが、私の勘違いでした。'<%# ds.Ttables('Ttantou') %>'に変えるのだと思ってやってみてエラーでした。
    と書いたつもりだったのです。
    '<%# ds.Tables("Ttantou") %>'で正常に動きました。わざわざ試していただいてすみませんでした。

    SqlDataSourceのこともわかりました。デザインからデータベースを設定したときと似たようなコードになりますよね?

     <asp:SqlDataSource
              id="SqlDataSource1"
              runat="server"
              DataSourceMode="DataReader"
              ConnectionString="<%$ ConnectionStrings:MyDB%>"
              SelectCommand="SELECT Tchumon_meisai.商品id, Tsyohin.商品名, Tchumon_meisai.注文数, Tsyohin.単価, (Tchumon_meisai.注文数 * Tsyohin.単価) As 金額 FROM Tsyohin INNER JOIN Tchumon_meisai ON Tsyohin.商品ID = Tchumon_meisai.商品id">
          </asp:SqlDataSource>

     &nbsp;伝票明細&nbsp; &nbsp;<asp:GridView ID="GridView1" runat="server"
                Width="194px" DataSourceID="SqlDataSource1" AutoGenerateColumns="False">
              </asp:GridView>

     上記のようなコードを書いてみたのですが、このような感じであってますか?

     >DataSet が一つか二つかの違いで「あまりにも遅かった」というほどの差
       は出ないと思います。どこかに別の原因がありそうな気がします。

       上記については原因はまだわからないのですが、検討してみたいと思います。

      あの、もうひとつ質問がありまして。。
      GridViewの一列だけにDropDownListを作成するのはかのうですか?

     

    2010年4月7日 2:37
  • > 上記のようなコードを書いてみたのですが、このような感じであっ
    > てますか?

    AutoGenerateColumns="False" では何も表示されないのではないです
    か? True にすれば、クエリで抽出したデータは GridView に表示
    されると思います。

    でも、何か変ですね。デザイン画面でウィザードベースで作っていく
    と多分 BoundField が自動生成されて AutoGenerateColumns="False"
    でもデータは表示されるようになるはずですが・・・

    アップするときその部分を削除しました?

    > GridViewの一列だけにDropDownListを作成するのは
    > かのうですか?

    可能です。

    TemplateField を用いて、その中に SqlDataSource と DropDownList
    を配置してください。

    GridView, DropDownList などをキーワードに検索すれば、参考にな
    るページが見つかると思います。

    • 編集済み SurferOnWww 2010年4月7日 12:40 誤記訂正
    2010年4月7日 12:11
  • 返信ありがとうございます。

    >AutoGenerateColumns="False" では何も表示されないのではないですか? 
    >True にすれば、クエリで抽出したデータは GridView に表示されると思います。

    >でも、何か変ですね。デザイン画面でウィザードベースで作っていく
    >と多分 BoundField が自動生成されて AutoGenerateColumns="False"
    >でもデータは表示されるようになるはずですが・・・

    >アップするときその部分を削除しました?

    コードについてですが、デザインとコードとで色々いじっていたので、自分で削除してしまったのかもしれません。
    改めて自分でSqlDataSourceを使った簡単なコードを書いてみました。
    データベースのデータをDropDownListに表示するという内容です。

     &nbsp;&nbsp; 担当者ID:&nbsp;
            <asp:DropDownList ID="t_id" runat="server"
                DataSourceID="SqlDataSource4" DataTextField="担当者ID" DataValueField="担当者ID"
                AutoGenerateColumns="False"  >
            </asp:DropDownList>
            <asp:SqlDataSource ID="SqlDataSource4" runat="server"
                 ConnectionString="<%$ ConnectionStrings:MyDB %>"
                 SelectCommand="SELECT [担当者ID] FROM [Ttantou]"></asp:SqlDataSource>

    AutoGenerateColumnsにTrueとFalseを入れて実行してみましたが、どちらもデータが表示されました。これは変なのでしょうか?

    GridViewの一列だけにDropDownListを作成することは上記の方法で出来ました。
    ありがとうございました。

    もう一つ質問されてください。
    GridViewを普通の帳票のように使うことはできますか?
    やりたいこととしては、下記のような入力画面です。
    商品idをDropDownListから選んでもらって商品名を表示するという内容です。
    ListViewを使えば可能だと思うのですが。。。


    +-------------------------------------------------------+
    |商品id      | 商品名  | 注文数  | 単価 | 金額   |
    ---------------------------------------------------------
    | [___]▼_] |              |             |         |            |
    --------------------------------------------------------- 
    | [___]▼_] |              |             |         |            |
    ---------------------------------------------------------
    | [___]▼_] |              |             |         |            |
    +-------------------------------------------------------+

     

    2010年4月8日 1:49
  • > コードについてですが、デザインとコードとで色々いじってい
    > たので、自分で削除してしまったのかもしれません。

    そんないいかげんなことをされてはコードなど見る気がしなくな
    ります。他人にコードを見てもらうなら、間違いがないように細
    心の注意をすべきと自分は思いますけど。

    > AutoGenerateColumnsにTrueとFalseを入れて実行して
    > みましたが、どちらもデータが表示されました。これは変なの
    > でしょうか?

    DropDownList には AutoGenerateColumns プロパティはありませ
    ん。少しは自分で調べてから質問するようにしてください。

    > GridViewを普通の帳票のように使うことはできますか?

    GridView でできないとまでは言えませんが、少なくとも、適切
    な使い方ではないと思います。

    普通の table タグを使って表を作って、その中に DropDownList,
    Label などのサーバーコントロールを配置してはいかがですか?


    ところで、質問が表題の「DataBind の使い方」とは違う内容にな
    ってきています。表題と違う質問は、新たに別のスレッドを立て
    て、そちらでするようにお願いします(他のユーザーのことも考え
    てください)。

    表題の問題が解決していたら、このスレッドはクローズしてくだ
    さい。

    • 回答としてマーク ちい 2010年4月9日 0:34
    2010年4月8日 13:19
  • 返信ありがとうございました。

    >そんないいかげんなことをされてはコードなど見る気がしなくなります。
    >他人にコードを見てもらうなら、間違いがないように細心の注意をすべきと自分は思いますけど。

    時間がなく焦っていたとはいえ軽率な行動でした。
    すみませんでした。

    >ropDownList には AutoGenerateColumns プロパティはありません。
    >少しは自分で調べるようにして下さい。

    すみません。完全にAutoGenerateColumns プロパティを勘違いしていました。
    AutoGenerateColumns プロパティは列を自動的に作成するかどうかのためのものでした。

    >ところで、質問が表題の「DataBind の使い方」とは違う内容になってきています。
    >表題と違う質問は、新たに別のスレッドを立てて、そちらでするようにお願いします
    >(他のユーザーのことも考えてください)。

    標題と違う質問をしたのに答えてくださってありがとうございました。
    少し自分で調べなおしてわからないようでしたら別のスレッドで質問させていただきます。

    SurferOnWwwさん、色々不愉快な思いをさせてしまってすみませんでした。
    たくさん質問に答えてくださってとても参考になりました。
    ありがとうございました。

    2010年4月9日 0:34