none
SqlDataSourceのデータを画面で使用して、さらにサーバ側のプログラムでも使用したい RRS feed

  • 質問

  • GridViewで表示するデータをSqlDataSourceから取得し、
    画面表示したとします

    このとき、取得したデータはSqlDataSourceには残っていると思うのですが、
    画面表示に使ったデータを、サーバ側のプログラムでも使用したいのですが、どのように取得したらいいでしょうか


    GridView1のデータソースにSqlDataSource1を指定

    例えば、
    Page_LoadやGridView1_Loadイベントの中で取り出したりする場合なのですが・・・

    SqlDataSourceのメソッドにそれらしいものが無く、
    GridViewのメソッドなりなんなりで取り出すのかな・・・とは思うのですが、よくわからなくて。

    画面表示に使われたSqlDataSourceのデータを取り出すにはどのように取り出したらいいでしょうか

    GridView1.Rows[1].Cells[0].Text
    とかやってみましたが、(Page_Loadの中などで)画面に表示されるはずの文字列は取得されず
    空白文字しか帰ってきませんでした
    rowsとcellsの個数から行くと、画面の縦横の数と一致しているのですが・・・
    2008年10月16日 13:10

回答

  • > 画面表示に使ったデータを、サーバ側のプログラムでも使用したいのですが、どのように取得したらいいでしょうか

     

    えと、この取得は

    ・最初の画面表示のとき

    ・Postbackが発生したとき

    のどちらで取得しようとしていますか?

     

    Postbackの場合であれば、みなさん返答されているとおりで、表示されているデータならとりだせる、ということになります。
    ただ、もともとの投稿では最初に画面表示するタイミングでデータを取得しようとしているようにも見えます。

     

    最初の画面表示の場合、データのバインディング(SqlDataSourceがデータを取り出すタイミング)はPage_Loadよりずっと遅くなりますので、Page_Loadとかではデータをとりだせません。

    Pageのイベントだったら、Page_PreRenderCompleteあたりであれば取り出せると思います。

    もしくはGridViewのPreRenderイベントとかで試してみてください。

     

    2008年10月17日 0:50

すべての返信

  •  いちろう さんからの引用

    GridViewで表示するデータをSqlDataSourceから取得し、
    画面表示したとします

    このとき、取得したデータはSqlDataSourceには残っていると思うのですが、
    画面表示に使ったデータを、サーバ側のプログラムでも使用したいのですが、どのように取得したらいいでしょうか

     

    GridView に表示したデータは SqlDataSource には残っておらず、ViewState として

    保持されています(GridView.EnableViewState を false に設定していなければ)。

     

    ポストバックをかけて、サーバー側でそのデータを GridView1.Rows[1].Cells[0].Text

    のようにして取得できるはずですが、空白文字しか帰ってこないのはやり方の問題だ

    と思います。

     

    もっと具体的にどうしたいのか書いてもらえれば、アドバイスができるかもしれません。

     

    ところで、先のスレッド「TreeViewのノードをクリックしたときの隠しパラメーター 」の

    件はどうなったんでしょう?


    2008年10月16日 15:05
  •  いちろう さんからの引用

    このとき、取得したデータはSqlDataSourceには残っていると思うのですが、


    残っていません。キャッシュするように指定すれば内部的には保持されますが、それを利用するのは一般的ではないでしょう。つまり、キャッシュされている期間内にもう一度Selectメソッドを実行してデータセットを取り出す方法です。
    それよりもスマートな解が以下にあります。

     

    How to get DataTable out of SqlDataSource
    http://msmvps.com/blogs/egoldin/archive/2006/12/27/how-to-get-datatable-out-of-sqldatasource.aspx

    2008年10月16日 15:21
    モデレータ
  • こんばんは!(^^)!ふ~です。

     

    Code Snippet

     

      // データーベースをセレクト条件
      SqlDataSource1.SelectCommand = "SELECT * FROM [xxxxxx]";

     

      // データーベースをセレクトする
      DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);

     

      // 検索結果があればコンソールに表示する
      if (0 < dv.Count)
      {
          // 一行毎にデータを読み出す。
          foreach (DataRowView rowView in dv)
          {
              // 一行のデータを表示する(読取る)
              Console.WriteLine( rowView[0].ToString() + ... rowView[5].ToString() );
          }
       }

     

     

    表示しているDataViewに値が残っていれば、「dv」の上記コードのように、一行毎に、列[0]、列[1]のように取り出せます。また、DataView dv = (DataView)SqlDataSourceのキャストは便利です。ご参考になれば幸いです。

    2008年10月16日 16:45
  •  !(^^)!ふ~ さんからの引用

      // データーベースをセレクトする
      DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);

     

    補足します。
    GridViewに表示した後に誰かがそのテーブルの値を変更した場合、
    DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
    で取得されるデータが異なる可能性があります。
    それを防ぐためには、GridViewにSqlDataSource1を直接適用しないで、上記で得られたdvを適用するようにすれば良いでしょう。

    2008年10月17日 0:43
    モデレータ
  • > 画面表示に使ったデータを、サーバ側のプログラムでも使用したいのですが、どのように取得したらいいでしょうか

     

    えと、この取得は

    ・最初の画面表示のとき

    ・Postbackが発生したとき

    のどちらで取得しようとしていますか?

     

    Postbackの場合であれば、みなさん返答されているとおりで、表示されているデータならとりだせる、ということになります。
    ただ、もともとの投稿では最初に画面表示するタイミングでデータを取得しようとしているようにも見えます。

     

    最初の画面表示の場合、データのバインディング(SqlDataSourceがデータを取り出すタイミング)はPage_Loadよりずっと遅くなりますので、Page_Loadとかではデータをとりだせません。

    Pageのイベントだったら、Page_PreRenderCompleteあたりであれば取り出せると思います。

    もしくはGridViewのPreRenderイベントとかで試してみてください。

     

    2008年10月17日 0:50
  • // データーベースをセレクトする
      DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);

    この方法でデータを取得できました
    欲しかったのはページロード時のデータだったので、いじられる前のデータで特に問題がないのでこれを使わせていただきました。
    2008年10月17日 4:26
  • おはようございます!(^^)!ふ~です。

    どうも中途半端な説明のようでした、

    MSDNライブラリの解説では、プログラムレスの説明は良くありますが、動的にGridViewを表示する方法は少ないように感じています。そこで、時間が有りましたので、はじめてASP.NETを使用する場合に欲しいサンプルを作成して見ました。

     

    サンプルタイトル GridViewにSqlDataSourceの内容を表示する

    1.VS200Xのデザイナーで、GridViewを貼り付け、何も設定しない状態にします。

     

    以下、自動作成された、その時のhtmlのソースです。

     <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>GreidViewの動的表示テスト</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>

     

    2.CSのソースを作成します。

    Code Snippet

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    public partial class _Default : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {

           // ポストバック以外であるか?

           if (!IsPostBack)
           {

               // ここは最初の呼び出しで通過します。

     

               ////////////////////////////////////////
               // GridViewにSqlDataSourceの内容を表示する //
               ////////////////////////////////////////

     

               // テーブルを作成
               DataTable  dataTable1 = new DataTable();
               DataColumn dataClumn1 = dataTable1.Columns.Add("年月日");
               DataColumn dataClumn2 = dataTable1.Columns.Add("メモ");

     

              // SqlDataSourceクラスのインスタンスを作成する。
               SqlDataSource SqlDataSource1 = new SqlDataSource();

     

               // SqlDataSourceに接続文字列を設定する
               SqlDataSource1.ConnectionString = @"Data Source="+
                @"PC名\SQLEXPRESS;Initial Catalog=TestData;Integrated Security=True;Pooling=False";

     

               // データベースを選択する
               SqlDataSource1.SelectCommand = "SELECT * FROM [TestTbl1] WHERE (年月日=@年月日)";

     

               // 検索条件を設定する
                SqlDataSource1.SelectParameters.Clear();
                SqlDataSource1.SelectParameters.Add("年月日", TypeCode.String, "2008/10/17");

     

               // データーベースをセレクトする
                DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);

     

                // 検索結果があれば行に追加する
                if (0 < dv.Count)
                {
                       // 一行毎にデータを読み出す。
                       foreach ( DataRowView rowView in dv )
                       {
                            // テーブルにデータを追加
                            dataTable1.Rows.Add(new Object[] { rowView[0].ToString(), rowView[1].ToString() });
                       }
                }

     

                // データグリッドの行の追加と削除、データ編集を不許可にする
                dataTable1.DefaultView.AllowNew = false;
                dataTable1.DefaultView.AllowDelete = false;
                dataTable1.DefaultView.AllowEdit = false;

     

                // 行をクリアする
                GridView1.Columns.Clear();

     

                // データソースを指定する。
                GridView1.DataSource = dataTable1;

     

                // 自動にRow(列)表示する
                GridView1.AutoGenerateColumns = true;

     

                // データーを表に入れる。
                GridView1.DataBind();

     

                // 消滅処理
                 SqlDataSource1.Dispose();
              }
         }
    }


     

     

    ●このソースを眺めますと、GridView GridView1=new GridView();と言う行がございません。実は、<asp:GridView ID="GridView1" runat="server"> </asp:GridView>とHTMLのタグで既にGridViewクラスのGridView1インスタンスを作成していますので、これをそのままプログラムで使用するのがポイントです。

    このHTMLのタグで作成した、GridView1インスタンスを使用しないと正常に表示できません。プログラムの中で、GridView GridView1=new GridView();では全く表示できません。(詳細な解析はご自分でご確認ください)

     

    また、 今回は使用しておりませんが、SqlDataSourceをデザイナー貼り付けで作成される<asp: SqlDataSourceID="SqlDataSource1" runat="server">< /asp : SqlDataSource>というタグはSqlDataSource SqlDataSource1 = new SqlDataSource();と同じ動作となります。デザイナーの貼り付けの場合は、SqlDataSource1.Dispose();も不要です。

     

    私のプログラムは、動的な処理が多いので表示に関係しないクラスのインスタンスは、プログラムで生成と消滅を管理したいので、このプログラムでも、DataSourceクラスのインスタンスを生成しています。

     

    GridViewの表示タイミングは、下記タイミングとなります。丁度、フォームのペイントのタイミングと同じです。

       protected void Page_Load(object sender, EventArgs e)
        {

           // ポストバック以外であるか?

           if (!IsPostBack)
           {

              画面の更新タイミング

           }

        }

     

    ●SQLへの接続文字列は、サーバーエクスプローラで、データーベースを作成した時のプロパティにある接続文字列をコピーしてそのまま使用します。

     

    ●テーブル名:TestTbl1、検索日:2008/10/17は、適当に調整が必要です。

     

    以上、ご参考になれば幸いです。

    2008年10月17日 4:43
  •  !(^^)!ふ~ さんからの引用

                // 検索結果があれば行に追加する
                if (0 < dv.Count)
                {
                       // 一行毎にデータを読み出す。
                       foreach ( DataRowView rowView in dv )
                       {
                            // テーブルにデータを追加
                            dataTable1.Rows.Add(new Object[] { rowView[0].ToString(), rowView[1].ToString() });
                       }
                }


    ADO.NET 2.0なら、ToTable()というメソッドが便利に使えますよ。

    dataTable1 = dv.ToTable();

    2008年10月17日 4:56
    モデレータ
  • 本質的な話ではありませんが。

     

    > GridViewの表示タイミングは、下記タイミングとなります。丁度、フォームのペイントのタイミングと同じです。

     

    Webフォームで「ペイント」という表現はおかしいと思います。
    せいぜいレンダリング(HTML化)だと思いますが、そのタイミングはPage_Loadからみるとずっと後ですね。

     

    また、「GridViewの表示」というのもちょっと変かな。

    GridViewにデータをバインドしているタイミングのことをいいたいんでしょうけど、これはGridViewのDataBindを直接よびだしているからそのタイミングでデータのバインドがおきているだけの話ですね。

     

    なお、SqlDataSource等をデザイナ画面から追加している場合、データのバインディングはPage_PreRenderとPage_PreRenderCompleteの間で行われます。

     

     

    2008年10月17日 5:52
  • trapemiyaさん、こんにちは!(^^)!ふ~です。

     

    dataTable1 = dv.ToTable();ですか、とても簡単で便利です。どうも有難うございます。

    dv.ToTable(string)など、使い方がいろいろ有るようです。

    http://msdn.microsoft.com/ja-jp/library/a8ycds2f(VS.80).aspx

    しかし、理解に悩むサンプルです。私は、MSDNライブラリのサンプルは、基本学習に観点を絞って単純が良いと思ってます。

    2008年10月17日 6:03
  • どっとねっとふぁんさん、こんにちは!(^^)!ふ~です。

     

    どうも失礼いたしました。呼び名は正確が一番ですが、発想の原点のイメージが伝わればと思います。

     

    >なお、SqlDataSource等をデザイナ画面から追加している場合、データのバインディングはPage_PreRenderと>Page_PreRenderCompleteの間で行われます。

     

    この辺は、御神輿に乗っている内は楽ですが、自分で担ぐのは辛いとう感じです。私は、今のところ、入り込まないようにプログラム仕様を作成する事が望ましいと思ってます。

     

    ご参照資料

    ASP.NET ページ フレームワークの概要(Page_PreRenderなど) 
    http://support.microsoft.com/kb/305141/ja

     

    どっとねっとふぁんさんの「複数行のデータを表示/編集できるGridView」

    http://dotnetfan.org/blogs/dotnetfanblog/archive/2006/04/21/669.aspx

     

    2008年10月17日 6:44
  • いちろうさんのレス、

     

    > DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
    > この方法でデータを取得できました

     

    ですが、DB からデータを取得して DataTable を作るということですと、普
    通(?)に ADO.NET ライブラリを使ったほうがよさそう(簡単そう)な気
    がします。SqlDataSource を使うことに特にメリットはなさそうに思います
    が、いかがでしょうか?

     

    また、!(^^)!ふ~ さんのレスで、

     

    > プログラムの中で、GridView GridView1=new GridView();では全く表示
    > できません。(詳細な解析はご自分でご確認ください)

     

    ということですが、それが好ましい方法かどうかはともかくとして、少な
    くとも表示はできるはずですが。

    2008年10月17日 15:08