none
GridViewに表示されているデータソースの列名の列挙 RRS feed

  • 質問

  • ASP.NET初心者の者です。

    asp:SqlDataSource でSQL Serverから取得したデータを
    asp:GridViewに表示しております。

    [DB]
    列名1:VAL1
    列名2:VAL2
    列名3:VAL3

    [aspxファイル]

        <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">
            <Columns>
                <%-- GridView  列1 --%>
                <asp:TemplateField HeaderText="GridView Column">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBoxC" runat="server" Text='<%# Eval("VAL2") %>'></asp:Label>
                    </EditItemTemplate>

                    <ItemTemplate>
                        <asp:Label ID="LabelC" runat="server" Text='<%# Bind("VAL2") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                <%-- GridView  列2 --%>
                <asp:TemplateField HeaderText="GridView Column">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBoxA" runat="server" Text='<%# Eval("VAL3") %>'></asp:Label>
                    </EditItemTemplate>

                    <ItemTemplate>
                        <asp:Label ID="LabelA" runat="server" Text='<%# Bind("VAL3") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                <%-- GridView  列3 --%>
                <asp:TemplateField HeaderText="GridView Column">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBoxB" runat="server" Text='<%# Bind("VAL1") %>'></asp:TextBox>
                    </EditItemTemplate>

                    <FooterTemplate>
                        <asp:Label ID="LabelB" runat="server" Text='<%# Bind("VAL1") %>'></asp:Label>
                    </FooterTemplate>
                </asp:TemplateField>


    [質問]
    C#のソースコードで、
    GridViewの各列に表示されているDBの列名を列挙したいのですが、
    そのようなことはできますでしょうか。

    [0] : VAL2
    [1] : VAL3
    [2] : VAL1
    のように、何列目にDBのどの列名のデータが表示されているかを
    取得したいと考えております。



    [条件]
    ※エディタを使用して、GridViewに表示する列順をDBの列順と異なるようにしています
     GridView 列1 : DBの列名2を表示
     GridView 列2 : DBの列名3を表示
     GridView 列3 : DBの列名1を表示

    ※エディタを使用して、HeaderText、コントロールIDなどを編集しています。

    ※何列目にどの列名が表示されているかを求める処理内で
     asp:TextBox、asp:LabelなどのID文字列("TextBoxC" など)は使用したくないと考えております。
     TextBoxCが含まれている列の…といった処理は行いたくないと考えております
     →コントロールIDを変更してもソースコードを変更させたくないため

    ※同じく、何列目にどの列名が表示されているかを求める処理内で
     DBの列名文字列("VAL1" など)を直接記述するのは避けたいと考えております。
     →DBの列名が変化しても変更してもソースコードを変更させたくないため

    ご教授お願い申し上げます。
    2015年7月9日 11:21

回答

  • 昨日から調べていたのですが、とりあえず形になりました。実際にバインドするのはテンプレート内のコントロールなんで、コントロールのバインド情報を取得することがポイントになると思います。いろいろ試してみましたし、ネットも調べてみましたが、これが限界のような気もしています。他に良い案があるかもしれませんが・・・

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            for (int i = 1; i < e.Row.Cells.Count; i++)
            {
                 var tmpfld = ((DataControlFieldCell)e.Row.Cells[i]).ContainingField as TemplateField;
    
                if (tmpfld != null)
                {
                    var dict = ((CompiledBindableTemplateBuilder)((TemplateField)((DataControlFieldCell)e.Row.Cells[i]).ContainingField).ItemTemplate).ExtractValues(e.Row.Cells[i].Controls[1]);
    
                    var keys = new object[1];
                    dict.Keys.CopyTo(keys, 0);
                    System.Diagnostics.Debug.WriteLine("Key = {0}, Value = {1}", keys[0], dict[0]);
                }
            }
    
        }
    }


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク cow bell 2015年7月13日 8:57
    2015年7月10日 9:05
    モデレータ
  • > 3)GridViewに更新ボタンを追加し、データ更新を行う:作業中

    「更新」ではなくて追加 (INSERT) ですよね。

    そもそも GridView には INSERT の機能はないということはご存知ですよね?
     
    サーバーコントロールにもとから備わっている機能以上のことをしようとすると、とたんに敷居が高くなりますし、予期せぬ問題も起こりやすいです。
     
    なので、GridView と同等な表形式で INSERT 機能も持っている ListView を使用することをお勧めします。別スレッドを見ると ASP.NET 4 とのことですので使えるはずです。

    というわけで終了・・・ということにしたいのですが、それでは何なのでその訳を少し書きます。

    > GridView1_RowCommandの処理を行うにあたり必要な情報は、
    > ⅰ)aspxファイルに記述されているコントロールID
    > ⅱ)バインド元のDBテーブルの列
    > だろうと判断しました。

    違います。

    参考にされている記事の RowCommand イベントのハンドラにおけるポイントは、ControlParameter コンストラクタの第三引数(パラメータのバインド先のコントロールの名前)に UniqueID を使うことです。そうしないとコントロールが見つからないというエラーになります。

    UniqueID とは何かは下のページを見てください。

    Control.UniqueID プロパティ
    https://msdn.microsoft.com/ja-jp/library/system.web.ui.control.uniqueid(v=vs.100).aspx

    ポストバックで、ユーザーが TextBox(html では <input type="text"... />)に入力した値がサーバーに送信される際、key(name 属性の値)と value(value 属性の値)がペアで送信されますが、この key に UniqueID が使用されますのでそれを利用しています。

    当該 TextBox から生成された html ソースは <input type="text"... /> となるはずですが、その name 属性を見てください。GridView1$ctl06$InsertUserName というような形になっていて、それには TestBox の ID が含まれているはずです。

    サーバー側では HttpRequest.Form.AllKeys で key のコレクションが取得できます。コレクションの中の key を一つ一つ調べて、key の値に当該 TextBox の ID が含まれていれば、その key の値を ControlParameter コンストラクタの第三引数に使用しています。

    というわけで、参考にされている記事はかなりのウラワザ、アクロバティック的なことをしています。ListView が無かった ASP.NET 2.0 時代はそれでやむを得なかったかもしれませんが、ASP.NET 3.5 以降には ListView があります。それを使ってください。

    どうしても GridView でなければならないという理由があるのでしたら、その旨連絡ください。


    【追伸】

    ⅰ) については上のレスで書きましたが、ⅱ) についても書いておきます。

    ⅱ) は INSERT クエリのパラメータ名になります。パラメータ名はテーブルのフィールド名と一致するとは限りません(Visual Studio のクエリビルダで作ると結果的に @ を除いた部分は一致しますが)。


    なので、

    > C#コードは変更せずに済ませたい

    というのは、かなり無理っぽいですよね。

    もともとがウラワザ的・アクロバティック的なのに、この上さらに「C#コードは変更せずに済ませたい」を実現するためにウラワザ的・アクロバティック的なことを積み重ねるのは、開発工数と保守性を考えた場合、決して得策とは思えないのですが。

    開発工数や保守性を考えなくてもよい趣味の問題ということなら話は別ですが・・・


    • 編集済み SurferOnWww 2015年7月13日 3:57 追伸追加&一部修正
    • 回答としてマーク cow bell 2015年7月13日 8:57
    2015年7月12日 15:19

すべての返信

  • 何をしたいのかよく分かりませんが・・・

    > GridViewの各列に表示されているDBの列名を列挙したいのですが、

    何もしないで(デザイン画面でウィザードを使って自分では一行も書かないで)作れば、SqlDataSource の SelectCommand で設定したクエリのフィールド名(SELECT * FROM <Table> としたなら <Table> のフィールド名)が GridView のヘッダ行に設定されるはずです。それならあらかじめ分かっているはずですが?

    そうではなくて、

    > ※エディタを使用して、HeaderText、コントロールIDなどを編集しています。

    ということなので、SelectCommand の設定や <Table> のフィールド名とは一致しないということですか?

    でも、自分で編集したのなら分かってるはずですよね?

    「列挙」というのがどういう意味か分かりませんが、自分でわかってることなら何とでもなると思うのですか?

    何にせよ、最終的に GridView のヘッダ行に表示される文字列のリストを取得したいということなら、GridView.RowCreated イベントのハンドラで、以下のようにすればできると思います。お試しください。

    List<String> headers = new List<String>();
    
    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {
            for (int i = 0; i < e.Row.Cells.Count; i++)
            {
                headers.Add(e.Row.Cells[i].Text);
            }
        }
    }

    2015年7月9日 14:23
  • SurferOnWww 様

    ご回答いただきありがとうございます。
    行いたいことをうまくお伝えできず申し訳ありません。


    > SelectCommand で設定したクエリのフィールド名(SELECT * FROM <Table> としたなら <Table> のフィールド名)が
    > GridView のヘッダ行に設定されるはずです。それならあらかじめ分かっているはずですが?
    はい、おっしゃる通りです。
    asp:TemplateField のHeaderText、または asp:BoundField のHeaderTextに
    設定されます。


    > SelectCommand の設定や <Table> のフィールド名とは一致しないということですか?
    はい。
    ウィザードでSqlDataSourceの設定を完了した後、
    手動でaspxファイル内の asp:TemplateField(asp:BoundField)の並びを変えております。
    また、HeaderTextも変更または削除しております。

    ご紹介いただきましたコードを初回質問時に記載しました[aspxファイル]に対して行いますと、
    列1:GridView Column ・・・ <%-- GridView  列1 --%>コメントの次の行の文字列
    列2:GridView Column ・・・ <%-- GridView  列2 --%>コメントの次の行の文字列
    列3:GridView Column ・・・ <%-- GridView  列3 --%>コメントの次の行の文字列
    が得られます。


    質問時の文章の記述がわかりにくく申し訳ありませんが、
    行いたいことは、

    SelectCommand で設定したクエリのフィールド名(SELECT * FROM <Table> とした場合、
    どの列に <Table> のどのフィールド名のデータが表示(バインド)されているかを取得したいのです。

    初回質問時に記載しました[aspxファイル]で言いますと、

    1列目
    <asp:TextBox ID="TextBoxC" runat="server" Text='<%# Eval("VAL2") %>'>
    →1列目には<Table>の "VAL2" フィールドが表示されているため
     "VAL2" という文字列を取得したく、

    2列目
    <asp:TextBox ID="TextBoxA" runat="server" Text='<%# Eval("VAL3") %>'>
    →"VAL3" という文字列を取得したいのです。



    ご指導お願い申し上げます。
    2015年7月10日 7:54
  • 昨日から調べていたのですが、とりあえず形になりました。実際にバインドするのはテンプレート内のコントロールなんで、コントロールのバインド情報を取得することがポイントになると思います。いろいろ試してみましたし、ネットも調べてみましたが、これが限界のような気もしています。他に良い案があるかもしれませんが・・・

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            for (int i = 1; i < e.Row.Cells.Count; i++)
            {
                 var tmpfld = ((DataControlFieldCell)e.Row.Cells[i]).ContainingField as TemplateField;
    
                if (tmpfld != null)
                {
                    var dict = ((CompiledBindableTemplateBuilder)((TemplateField)((DataControlFieldCell)e.Row.Cells[i]).ContainingField).ItemTemplate).ExtractValues(e.Row.Cells[i].Controls[1]);
    
                    var keys = new object[1];
                    dict.Keys.CopyTo(keys, 0);
                    System.Diagnostics.Debug.WriteLine("Key = {0}, Value = {1}", keys[0], dict[0]);
                }
            }
    
        }
    }


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク cow bell 2015年7月13日 8:57
    2015年7月10日 9:05
    モデレータ
  • 先のレスに書いた、「最終的に GridView のヘッダ行に表示される文字列のリスト」が必要なものかと思ってましたが、誤解していたようです。

    > SelectCommand で設定したクエリのフィールド名(SELECT * FROM <Table> とした場合、
    > どの列に <Table> のどのフィールド名のデータが表示(バインド)されているかを取得したいのです。

    > 手動でaspxファイル内の asp:TemplateField(asp:BoundField)の並びを変えております。

    質問者さんが並び替えた結果の通りになりますよね?

    そうであれば、自分で順番を決めて静的に設定した(ハードコーディングした)のですから、「どの列に <Table> のどのフィールド名のデータが表示」という情報も一緒にハードコーディングしておけば済むと思うのですが・・・

    プログラムで動的に取得する理由がわかりません。そうする必要があることがわかる全体的なシナリオを教えていただけませんか?


    【追伸】

    興味本位ではなく、質問者さんが考える全体的なシナリオを聞いて、それに沿ってやりたいことを実現するという視野で考えると、局所的なことを考えるより、ひょっとしたらもっとスマートな方法があるかもしれないと思って聞いています。

    • 編集済み SurferOnWww 2015年7月10日 11:13 追伸追記
    2015年7月10日 9:49
  • Trapemiya さんのコードを参考に、BoundField と TemplateField が混ざっている GridView で、GridView の列に表示される順番でデータソースのフィード名を取得するサンプルを作ってみました。

    Microsoft のサンプルデータベース Northwind の Products テーブルを使っています。

    どう考えてもこんなことをやる理由はなさそうな気がします。前にもお願いしましたが、そうする必要があることがわかる全体的なシナリオを教えていただけませんか?

    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
        List<string> headers = new List<string>();
        
        protected void GridView1_PreRender(object sender, EventArgs e)
        {        
            GridViewRow row = ((GridView)sender).Rows[0];
            
            for (int i = 0; i < row.Cells.Count; i++)
            {
                DataControlFieldCell cell = (DataControlFieldCell)row.Cells[i];
                DataControlField field = cell.ContainingField;
                
                if (field is BoundField)
                {
                    headers.Add(((BoundField)field).DataField);
                }
                else if (field is TemplateField)
                {
                    OrderedDictionary dictionary = new OrderedDictionary();
                    ((TemplateField)field).ExtractValuesFromCell(
                            dictionary, 
                            cell, 
                            DataControlRowState.Normal, 
                            false);
                    ICollection keys = dictionary.Keys;
                    String[] myKeys = new String[dictionary.Count];
                    keys.CopyTo(myKeys, 0);                
                    headers.Add(myKeys[0]);
                }
            }
    
            Label3.Text = "";
            foreach (string s in headers)
            {
                Label3.Text += s + " ";
            }
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>        
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                ConnectionString="<%$ ConnectionStrings:Northwind %>" 
                SelectCommand="SELECT * FROM [Products]">
            </asp:SqlDataSource>
            
            <asp:GridView ID="GridView1" runat="server" 
                AllowPaging="True" 
                AutoGenerateColumns="False" 
                DataKeyNames="ProductID" 
                DataSourceID="SqlDataSource1" 
                OnPreRender="GridView1_PreRender">
                <Columns>
                    <asp:BoundField DataField="ProductID" 
                        HeaderText="商品ID" InsertVisible="False" 
                        ReadOnly="True" SortExpression="ProductID" />
                    <asp:TemplateField HeaderText="生産終了" 
                        SortExpression="Discontinued">
                        <ItemTemplate>
                            <asp:CheckBox ID="CheckBox1" runat="server" 
                                Checked='<%# Bind("Discontinued") %>' 
                                Enabled="false" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="UnitsOnOrder" 
                        HeaderText="注文中の数量" 
                        SortExpression="UnitsOnOrder" />
                    <asp:TemplateField HeaderText="供給者ID" 
                        SortExpression="SupplierID">
                        <ItemTemplate>
                            <asp:Label ID="Label2" runat="server" 
                                Text='<%# Bind("SupplierID") %>'>
                            </asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="CategoryID" 
                        HeaderText="カテゴリーID" 
                        SortExpression="CategoryID" />
                    <asp:BoundField DataField="QuantityPerUnit" 
                        HeaderText="ユニット当り数量" 
                        SortExpression="QuantityPerUnit" />
                    <asp:TemplateField HeaderText="商品名" 
                        SortExpression="ProductName">
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" 
                                Text='<%# Bind("ProductName") %>'>
                            </asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="UnitPrice" 
                        HeaderText="単価" 
                        SortExpression="UnitPrice" />
                    <asp:BoundField DataField="UnitsInStock" 
                        HeaderText="ストック" 
                        SortExpression="UnitsInStock" />
                    <asp:BoundField DataField="ReorderLevel" 
                        HeaderText="再発注レベル" 
                        SortExpression="ReorderLevel" />                
                </Columns>
            </asp:GridView>
            <asp:Label ID="Label3" runat="server"></asp:Label>
        </div>
        </form>
    </body>
    </html>


    【追伸】

    Field のタイプによって if 文で処理を分けなくてももっと簡単にできるかもしれません。どうしても動的に取得する必要があることが明らかになったら、もっとスマートな方法を考えたいと思います。

    • 編集済み SurferOnWww 2015年7月11日 2:52 追伸追加
    2015年7月10日 14:35
  • trapemiya 様

    返信が遅くなってしまい申し訳ございません。

    手元のソースで動作確認を行いましたところ、
    必要としている情報を得ることができることを確認いたしました。

    MSDNを見ながらソースを読ませていただいたのですが、
    正直内容が難しく、今の時点では十分理解できておりません。

    その後、SurferOnWww 様よりご返信をいただきましたが、
    最終的に私が行いたかった内容について、
    検討していた方法で行うのはメリットが少ないので
    別の方法を検討することとします。

    今回はご回答いただきありがとうございました。
    今後もお世話になることがあるかと思いますが、
    その際はよろしくお願いいたします。
    • 編集済み cow bell 2015年7月13日 8:57
    2015年7月12日 11:40
  • SurferOnWww 様

    ご回答いただきありがとうございます。
    返信が遅くなってしまい申し訳ございません。

    最終的に行いたいことについて、返信させていただきます。


    ○行いたいこと
    1)GridViewにDBから取得した結果をバインドし表示する:済
    2)GridViewに編集・削除ボタンを追加し、データ編集・削除を行う:済
    3)GridViewに更新ボタンを追加し、データ更新を行う:作業中


    3)を行うにあたり、下記のページを参考にして同様の処理は作成しました。
    GridViewからデータを追加する | どっとねっとふぁん
    https://blogonos.wordpress.com/2006/03/29/gridview%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/

    ページ中段辺りに、GridView1_RowCommandでSqlDataSource1.Insert()を行っている部分があります。
    この処理を、
    ・aspxファイルに記述されているコントロールIDが変更されても、C#コードは変更せずに済ませたい
    ・バインド元のDBテーブルの列が変化しても、C#コードは変更せずに済ませたい
    を思ったのが今回質問させていただいたきっかけです。

    GridView1_RowCommandの処理を行うにあたり必要な情報は、
    ⅰ)aspxファイルに記述されているコントロールID
    ⅱ)バインド元のDBテーブルの列
    だろうと判断しました。
    (Insertする情報を入力するコントロールはTextBoxであると想定しております)

    ⅰ)の情報を得るには、
    フッターに配置されているTextBoxを見つければ、そのID等から得られるのではないかと考えました。

    ⅱ)の情報を得るには、
    GridViewにSqlDataSourceがどのようにバインドしているかを知ることができればと思ったのですが、
    どうすれば実現できるか方法がわからず、質問させていただきました。



    私の検索の仕方に問題があるのかもしれませんが、
    GridViewを用いた編集・削除の例と比較してデータ挿入を行う例が少ないため
    どのように行うのが効率的で一般的なのかがよくわかりません。

    今回の質問とはややずれてしまいますが、
    一般的な手順等などについてもご教授いただけますとありがたいです。

    2015年7月12日 11:41
  • > 3)GridViewに更新ボタンを追加し、データ更新を行う:作業中

    「更新」ではなくて追加 (INSERT) ですよね。

    そもそも GridView には INSERT の機能はないということはご存知ですよね?
     
    サーバーコントロールにもとから備わっている機能以上のことをしようとすると、とたんに敷居が高くなりますし、予期せぬ問題も起こりやすいです。
     
    なので、GridView と同等な表形式で INSERT 機能も持っている ListView を使用することをお勧めします。別スレッドを見ると ASP.NET 4 とのことですので使えるはずです。

    というわけで終了・・・ということにしたいのですが、それでは何なのでその訳を少し書きます。

    > GridView1_RowCommandの処理を行うにあたり必要な情報は、
    > ⅰ)aspxファイルに記述されているコントロールID
    > ⅱ)バインド元のDBテーブルの列
    > だろうと判断しました。

    違います。

    参考にされている記事の RowCommand イベントのハンドラにおけるポイントは、ControlParameter コンストラクタの第三引数(パラメータのバインド先のコントロールの名前)に UniqueID を使うことです。そうしないとコントロールが見つからないというエラーになります。

    UniqueID とは何かは下のページを見てください。

    Control.UniqueID プロパティ
    https://msdn.microsoft.com/ja-jp/library/system.web.ui.control.uniqueid(v=vs.100).aspx

    ポストバックで、ユーザーが TextBox(html では <input type="text"... />)に入力した値がサーバーに送信される際、key(name 属性の値)と value(value 属性の値)がペアで送信されますが、この key に UniqueID が使用されますのでそれを利用しています。

    当該 TextBox から生成された html ソースは <input type="text"... /> となるはずですが、その name 属性を見てください。GridView1$ctl06$InsertUserName というような形になっていて、それには TestBox の ID が含まれているはずです。

    サーバー側では HttpRequest.Form.AllKeys で key のコレクションが取得できます。コレクションの中の key を一つ一つ調べて、key の値に当該 TextBox の ID が含まれていれば、その key の値を ControlParameter コンストラクタの第三引数に使用しています。

    というわけで、参考にされている記事はかなりのウラワザ、アクロバティック的なことをしています。ListView が無かった ASP.NET 2.0 時代はそれでやむを得なかったかもしれませんが、ASP.NET 3.5 以降には ListView があります。それを使ってください。

    どうしても GridView でなければならないという理由があるのでしたら、その旨連絡ください。


    【追伸】

    ⅰ) については上のレスで書きましたが、ⅱ) についても書いておきます。

    ⅱ) は INSERT クエリのパラメータ名になります。パラメータ名はテーブルのフィールド名と一致するとは限りません(Visual Studio のクエリビルダで作ると結果的に @ を除いた部分は一致しますが)。


    なので、

    > C#コードは変更せずに済ませたい

    というのは、かなり無理っぽいですよね。

    もともとがウラワザ的・アクロバティック的なのに、この上さらに「C#コードは変更せずに済ませたい」を実現するためにウラワザ的・アクロバティック的なことを積み重ねるのは、開発工数と保守性を考えた場合、決して得策とは思えないのですが。

    開発工数や保守性を考えなくてもよい趣味の問題ということなら話は別ですが・・・


    • 編集済み SurferOnWww 2015年7月13日 3:57 追伸追加&一部修正
    • 回答としてマーク cow bell 2015年7月13日 8:57
    2015年7月12日 15:19
  • SurferOnWww 様

    ご回答いただきありがとうございます。
    (行いたかったことはInsertです)


    たくさんのご指摘をいただきありがとうございました。

    勉強不足で恥ずかしいのですが、
    ListViewについては、今回のご返信でこのようなコントロールがあることを知りました。

    半日ほどListViewを使ってみたのですが
    おっしゃる通り、ListViewを使い、
    わかりやすい記述をすることを優先すべきと感じました。


    今回は質問内容以外の点でも多くのことを学ぶことができ、大変勉強になりました。
    ASP.NETの勉強を始めてまだ間もなく、知識も不足していることから
    ベテランの方からはおかしな質問をしていると思われることもあるかもしれませんが、
    今後もご指導のほどよろしくお願いいたします。
    2015年7月13日 8:57