none
CSVデータ取得後のGRIDVIEWへの取り込み方について RRS feed

  • 質問

  • お知恵をお貸しください。

    ASP4+C#にて、勉強を行っております。

    GridViewへのデータとして、CSVファイルを取り込み、データソースを割り当て、バインドし、見ることはできました。

    (GriDViewには、設定を行っておらず、CSVファイルのまま出力されます)

    ここで、列名を追加編集して、出力を考えていますが、列のプロパティにあるDataFieldに何を入れればよいか、

    迷っています。ぜひ、アドバイスをお願いします。

    a.aspx.cs 部は、下記です。

     protected DataTable set_DT = new DataTable();
            public string[] headers;

            protected void _Reader()
            {

                string ini_file = @"c:/Web_Server/dumy.ini";
                // open the file "data.csv" which is a CSV file with headers

                using (CsvReader csv = new CsvReader(
                                       new StreamReader(ini_file), true))
                {
                    int fieldCount = csv.FieldCount;
                    headers = csv.GetFieldHeaders();

                    DataRow dr;
                    DataColumn dc;
                    for (int i = 0; i < fieldCount; i++)
                    {
                        dc = new DataColumn(headers[i], typeof(String));
                        set_DT.Columns.Add(dc);
                     
                    }

                    while (csv.ReadNextRecord())
                    {
                        dr = set_DT.NewRow();
                        for (int i = 0; i < fieldCount; i++)
                        {
                            dr[headers[i]] = csv[i];
                        }
                        set_DT.Rows.Add(dr);
                    }

                    GridView.DataSource = set_DT;
                    GridView.DataBind();
                }

            }

    a.aspx部は、下記です。

    <asp:GridView ID="GridView" runat="server" BackColor="White" BorderColor="#999999">
                                       
                                        <Columns>
                                            <asp:BoundField DataField="<%= headers[0]%>" HeaderText="追加行1" />
                                            <asp:BoundField DataField="<%= headers[1]%>" HeaderText="追加行2" />
                                            <asp:BoundField DataField="<%= headers[2]%>" HeaderText="追加行3" />
                                       
                                        </Columns>
                                       
                                    </asp:GridView>

    ここま。

    <Columns>を入れると、表示されなくなりました。

     DataField="<%= headers[0]%>" ここの正しい、当て方をお教えください。

    CSVデータは、3列です。

    お願いいたします。

     

    2011年8月30日 11:43

回答

  • DataField="<%= headers[0]%>" のようにはできませんので、そこには DataTable
    の各 Column の ColumnName を手書きで記入するほかありません。

    他には、以下の方法があると思います。

    (1) DataTable の各 Column の ColumnName を書き換えてからバインドする。
    (2) TemplateField を使用する。
    (3) Page.Load イベントのハンドラで動的に BoundField を生成し、その各
    プロパティ(HeaderText, DataTextField など)を設定し、GridView
    に追加する。
    (4) GridView.RowCreated イベントのハンドラで書き換える。

    ただし、

    > 目的は、ページ内に固定項目表があり、そこに複数のCSVデータを動的に張り替え
    > たい為です。

    このあたり、依然として理解できませんので、目的に適うかどうかわかりませんが。
    また、

    > 合わせて、動的に編集を行い、編集後に”適用ボタン”でCSVに書き戻しを考えて
    > います。

    これは、どのようにすれば可能か見通しを立ててから、全体的な構成を考えた方がい
    いと思います。ひょっとしたら、最初から無理なことをしているかもしれません。

    • 回答としてマーク Itumi 2011年9月1日 0:13
    2011年8月31日 14:00

すべての返信

  • CSV は関係なくて(強いて言えば CSV ファイルから DataTable を作った点が
    関係あるかもしれませんが)、ある DataTable があって、それを GridView
    に表示する際何かがしたいということのようですが、何をしたいのか分かり
    ません。

    「列名を追加編集して、出力を考えていますが」とのことですが意味不明で
    す。もっと具体的に何がしたいのか書いていただけませんか。

     

    2011年8月30日 12:37
  • 返信が遅くなりました。

    GridViewの編集で列追加した項目への割り付けを考えています。

    現在は、GridViewに追加設定を行わず(貼っただけ)、DataTableをバインドすると、

    CSVで書いた通り出力されます。(これは、これで良いのですが・・。)

    このままだと、面白くないので、1列目には、名前を”設定1”、2列目には、”設定2”の様に決めて(ASPX側 下記Columns追加)

    CSVのデータを割り当てることが出来ないかをお教えください。

    (a.aspx)

    <Columns>
      <asp:BoundField DataField=”CSVデータの1項目目”    HeaderText="設定1" />
      <asp:BoundField DataField=”CSVデータの2項目目”      HeaderText="設定2" />
      </Columns>

    そもそもの使い方として、間違っているのでしょうか?

    2011年8月31日 1:50
  • 素直に GridView の AutoGenerateColumns を true にしてはいかがでしょうか。

    DataTable-DataColumn に設定されている内容に従ってカラムのヘッダ等が設定されますので。

     


    Kazuhiko Kikuchi
    2011年8月31日 11:14
  • ご返信ありがとうございます。調べてみたところ、

    GridViewのAutoGenerateColumns は、trueになっていました。

    CSVデータをそのまま張り付ける、コードは、上記質問の中で、有効に働いています。

    for (int i = 0; i < fieldCount; i++)
                    {
                        dc = new DataColumn(headers[i], typeof(String));
                        set_DT.Columns.Add(dc);
                     
                    }

    while (csv.ReadNextRecord())
                    {
                        dr = set_DT.NewRow();
                        for (int i = 0; i < fieldCount; i++)
                        {
                            dr[headers[i]] = csv[i];
                        }
                        set_DT.Rows.Add(dr);
                    }

    これを、そのままGridViewに張ることは可能でした。

    今回の質問は、意図的に定義したColumへのデータ貼り付けができなくて困っています。

    (a.aspx)

    <Columns>
      <asp:BoundField DataField=”CSVデータの1項目目”    HeaderText="設定1" />
      <asp:BoundField DataField=”CSVデータの2項目目”      HeaderText="設定2" />
      </Columns>

    上記の様に意図的に設定した、Columにデータをバインドする方法は、あるのでしょうか?

    CSVデータとしては、Colum項目データ無しで、別に定義された(a.aspxの中で、Colum定義)GridViewへの

    貼り付けができないかを考えています。

    目的は、ページ内に固定項目表があり、そこに複数のCSVデータを動的に張り替えたい為です。

    合わせて、動的に編集を行い、編集後に”適用ボタン”でCSVに書き戻しを考えています。

    別の的確な方法があれば、ご教授願います。データはCSVでお願いします。

     

    2011年8月31日 11:55
  • DataField="<%= headers[0]%>" のようにはできませんので、そこには DataTable
    の各 Column の ColumnName を手書きで記入するほかありません。

    他には、以下の方法があると思います。

    (1) DataTable の各 Column の ColumnName を書き換えてからバインドする。
    (2) TemplateField を使用する。
    (3) Page.Load イベントのハンドラで動的に BoundField を生成し、その各
    プロパティ(HeaderText, DataTextField など)を設定し、GridView
    に追加する。
    (4) GridView.RowCreated イベントのハンドラで書き換える。

    ただし、

    > 目的は、ページ内に固定項目表があり、そこに複数のCSVデータを動的に張り替え
    > たい為です。

    このあたり、依然として理解できませんので、目的に適うかどうかわかりませんが。
    また、

    > 合わせて、動的に編集を行い、編集後に”適用ボタン”でCSVに書き戻しを考えて
    > います。

    これは、どのようにすれば可能か見通しを立ててから、全体的な構成を考えた方がい
    いと思います。ひょっとしたら、最初から無理なことをしているかもしれません。

    • 回答としてマーク Itumi 2011年9月1日 0:13
    2011年8月31日 14:00
  • ありがとうございました。

    >DataField="<%= headers[0]%>" のようにはできませんので、そこには DataTable
    >の各 Column の ColumnName を手書きで記入するほかありません。

    手書きで、Column名を入れるだけで、読み込めました。<% ** %>など、無でもOKでした。

    後は、お教えいただいた中で、勉強させていただきます。

     

     

    2011年9月1日 0:18