none
ASP.NET3.5 GridViewのDataSourceの内容を書き換えても表示が変わらない。 RRS feed

  • 質問

  • 毎度、お世話になります。

    以前、XmlDataSource.Docを使ったGridViewへ動的にXmlオブジェクトをバインドする方法を教えて頂いたのですが、

    今回、データ量が多いためGridViewのPager機能を使わずに自力で20行/頁でページ切り替えを行なう様にしたのですが、

    初回は表示されますが、次にXmlDataSource.Docの内容を書き換えても、その内容で表示されず初回表示のままです。

    内容を書き換えた後で、XmlDataSourceとGridViewのDataBindは発行しています。

    原因が分からず困っています。どなたか御教授をお願い致します。

    2010年9月27日 11:00

回答

  • 返信して頂いた皆様、ありがとうございます。

    ソースコードを見て頂ければ分かる通り、XmlDataSoruseに拘ったのが間違いでした。

    動的にxmlデータを取得してGridViewの分かる形のxml形式に変換してXmlDataSoruse.Dataに

    入れるという無駄な事をしていました。

    経緯としては、XmlDataSoruseにスタイルシート(xsl)を持たせていたのですが、今回の表示が上手くいかない

    のはxslの性ではと思いプログラムでxml形式変換していました。

    原因が分からないし、どうせプログラムで形式変換するならDataTableでも良いかという結論です。

    DataTableを作り、GridView.DataSourceに入れる方式に変えたら表示されるようになりました。

    本質的な結論には成りませんでしたが、お世話になりました。

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

    追記:本質的な結論は、XmlDataSoruse.EnableCaching=falseで改善される様です。

    本体であるDataの内容を書き換えてもキャッシュが有効なのには驚きですが...

     

    • 回答としてマーク マリカ 2010年9月28日 6:21
    • 編集済み マリカ 2010年9月30日 5:10
    2010年9月28日 6:20

すべての返信

  • > 以前、XmlDataSource.Docを使ったGridViewへ動的にXmlオブジェクト
    > をバインドする方法を教えて頂いたのですが、

    XmlDataSource.Doc って何ですか? 確か以前の話は、

    > なかむら様の御指南のXmlDataSourceのDataに、XML文字列を設定して
    > 出来ました。

    ということだったはずですが、そこのところは変わってないですか?

    > 今回、データ量が多いためGridViewのPager機能を使わずに自力で
    > 20行/頁でページ切り替えを行なう様にしたのですが、

    何故 GridView の機能を使わないのか理解できませんが、それはとも
    かくとして、少なくとも「自力で20行/頁でページ切り替え」を具体
    的にどのようにしているのか書いていただけませんか。

    できれば、問題を再現できる必要最低限のコードに絞って、それをア
    ップしてもらえると、回答者のほうでも再現できるので、お役に立て
    るかもしれません。

    2010年9月27日 12:40
  • > XmlDataSource.Doc って何ですか?

    記載ミスです。XmlDataSource.Dataの間違いです。

    > 何故 GridView の機能を使わないのか理解できませんが、

    データ量が何万行もある場合があるためです。

    GridViewのPager機能を使った場合、PostBackのたびに全データを取得しないとダメですよね?

    それをしなくてもよい方法が在れば自力のページ切り替え処理は要らないです。

    何か良い方法がありますか?

    ソースコードを記載します。

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                PageCount.Text = "1";
                string s = ListXmlMake(PageCount.Text);
            }
        }

        protected string ListXmlMake(string offset)
        {
           //
            //  HttpWebResponse による xmlの取得ロジックは省略
            //
            string xmldoc = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><results>";
            for (int i = 3; i < cnode.Count; i++)
            {
                node = cnode[i];
                if (node.Name != "result") continue;
                XmlNodeList rnode = node.ChildNodes;
                xmldoc += "<result docno=\"" + rnode[0].InnerText + "\"";
                xmldoc += " id=\"" + rnode[1].InnerText + "\"";
                xmldoc += " name=\"" + cm.EntityConv(rnode[2].InnerText) + "\"";
                xmldoc += " date=\"" + cm.EntityConv(rnode[4].InnerText) + "\"/>\r\n";
            }
            xmldoc += "</results>";
            XmlDataSource.Data = xmldoc;
            XmlDataSource.DataBind();
            DataGridView.Visible = true;  <-- ここでブレイクするとXmlDataSource.Dataは変わっている
            DataGridView.DataBind();

    return "";
        }

        protected void PageIndexChanging(Object sender, EventArgs e)
        {
            // 次ページが押された時

            PageCount.Text = (int.Parse(PageCount.Text) + 1).ToString();
            string s = ListXmlMake(PageCount.Text);
        }

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

    2010年9月28日 0:33
  • GridViewのPager機能を使った場合、PostBackのたびに全データを取得しないとダメですよね?


    ObjectDataSourceにしてGridViewのページング機能つかって1ページ分のデータづつ取得したらどうでしょうか?

    #ObjectDataSourceではなくXmlDataSourceでもできるかは未確認

    サードパーティ製の例↓ですがGridViewでも同じだったはず(未確認)

    http://codezine.jp/article/detail/5351?p=3


    http://blogs.wankuma.com/hatsune/
    2010年9月28日 0:47
  • XmlDataSource はページングをサポートしていないみたいです。

    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.xmldatasource(VS.80).aspx

    GridView でページングを実装するなら、ObjectDataSource を使った方がいいかもしれませんね。

    http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.objectdatasource(VS.80).aspx

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年9月28日 5:18
  • 返信して頂いた皆様、ありがとうございます。

    ソースコードを見て頂ければ分かる通り、XmlDataSoruseに拘ったのが間違いでした。

    動的にxmlデータを取得してGridViewの分かる形のxml形式に変換してXmlDataSoruse.Dataに

    入れるという無駄な事をしていました。

    経緯としては、XmlDataSoruseにスタイルシート(xsl)を持たせていたのですが、今回の表示が上手くいかない

    のはxslの性ではと思いプログラムでxml形式変換していました。

    原因が分からないし、どうせプログラムで形式変換するならDataTableでも良いかという結論です。

    DataTableを作り、GridView.DataSourceに入れる方式に変えたら表示されるようになりました。

    本質的な結論には成りませんでしたが、お世話になりました。

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

    追記:本質的な結論は、XmlDataSoruse.EnableCaching=falseで改善される様です。

    本体であるDataの内容を書き換えてもキャッシュが有効なのには驚きですが...

     

    • 回答としてマーク マリカ 2010年9月28日 6:21
    • 編集済み マリカ 2010年9月30日 5:10
    2010年9月28日 6:20
  • すでに解決したようで、今さらながらのレスですが・・・

    キャッシュが問題なのかもしれませんね。検証してないので(検証しようがな
    いですが)、以下のようにするとうまくいくかもしれません。

    Gridview Paging with XmlDataSource
    http://forums.asp.net/p/1550068/3805949.aspx

    ポストバック時の Page_Load および GridView の PageIndexChanging イベン
    トで、毎回 XmlDataSource を初期化して xml 文字列を Data に設定し、それ
    を GridView.DataSource に設定して DataBind しています。

    2010年9月28日 13:23