none
GridViewでデータ取得が0件でもフッターを表示したい RRS feed

  • 質問

  • お世話になっております

    GridViewを利用して表示を行っているのですが、データが0件の場合でもフッターを表示する事はできないでしょうか?

    ShowHeaderWhenEmptyはあるようなのですが、同等にフッターもEmpty状況で表示したいです。

    何か方法があれば教えて下さい。

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


    2013年10月17日 11:27

回答

  • いくつか方法があります。

    1.EmptyDataTemplateを使う方法

    これが一番お手軽ですが、GridViewに表示する列が変更になった時、EmptyDataTemplateも忘れずに修正しなければならないことがネックです。

    DISPLAY GRIDVIEW WITH EMPTY MESSAGE AND HEADER AND FOOTER WHEN NO DATA IN ASP.NET
    http://www.aspsnippets.com/Articles/Display-GridView-with-Empty-Message-and-Header-and-Footer-when-no-data-in-ASP.Net.aspx

    2.レコードが無いなら追加してしまおうという方法

    理にかなってますが、以下の例ではブランク行を追加しているため、AutoGenerateColumnsプロパティがfalse、つまり自分で列を設定している場合、バインディングでエラーになる場合があるでしょう。この場合、適当な値の入った行を追加してバインドさせ、その後、GridViewの1行目、つまりこの追加した行のVisibleをfalseにして非表示にするとうまく行くかもしれません。

    How to Display ASP.NET GridView Header and Footer When No Data is Present?
    http://dotnetspidor.blogspot.jp/2008/07/how-to-display-gridview-header-and.html

    Show Header and Footer of GridView when no Data returned.
    http://geekswithblogs.net/dotNETvinz/archive/2009/03/11/tiptrick-show-header-and-footer-of-gridview-when-no-data.aspx

    3.GridViewをサブクラス化して、コードでHeader & Footerを追加する方法

    Empty Grid View with Header & Footer
    http://www.dotnetspider.com/resources/38045-Empty-Grid-View-with-Header-Footer.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年10月18日 2:43
    モデレータ
  • そもそも GridView には INSERT の機能はないということはご存知ですよね?

    サーバーコントロールにもとから備わっている機能以上のことをしようとすると、とたんに敷居が高くなりますし、予期せぬ問題も起こりやすいです。

    なので、GridView と同等な表形式で INSERT 機能も持っている ListView を使用することをお勧めします。

    ShowHeaderWhenEmpty プロパティが使えるということは ASP.NET 4 以上のはずで、ListView(ASP.NET 3.5 以降)は使用できますよね?

    何らかの理由があって ListView は使用できず、どうしても GridView ということなら、以下のページに、 GridView での INSERT の実現方法およびデータが存在しない場合の対応例がありますので、参考にしてみてください。

    GridViewからデータを追加する
    http://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/

    #質問の際には、何を開発しようとしているか(最初の質問では、Windows アプリなのか Web アプリなのかも分かりません)、ご自分の環境(OS, IIS, .NET, Visual Studio のバージョン、使用しているブラウザなど)を明記してください。


    #質問の内容に適切なフォーラムを選んでください。この内容ですと、ASP.NET のフォーラムの方が良いと思います。
    2013年10月18日 4:09
  • なぜ GridView1_RowCommand メソッドを紹介したページのサンプルコード(追記ではない方。即ち下記)のようにしないのですか?

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
        if (e.CommandName == "Insert") 
        { 
            SqlDataSource1.InsertParameters.Clear(); 
            foreach (string key in Request.Form.AllKeys) 
            { 
                if (key.Contains("$InsertUserName")) 
                    SqlDataSource1.InsertParameters.Add(new ControlParameter("userName", TypeCode.String, key, "Text")); 
                if (key.Contains("$InsertMailAddress")) 
                    SqlDataSource1.InsertParameters.Add(new ControlParameter("mailAddress", TypeCode.String, key, "Text")); 
            } 
            SqlDataSource1.Insert(); 
        } 
    }
    

    自分でもこのコードで検証してみましたが結果 OK でした。上記のコードに習って書けば FindControl や FindControlRecursive メソッドで探す必要はないはずです。

    上記のコードのようにできない理由があれば、それをきちんと書いてください。


    C# が読めなくて VB.NET に正確に直せないということなら、以下のサイトで C# を VB.NET に変換するサービスが提供されているので、使ってみてはいかがですか。完璧とまでは行かなくて多少手直しが必要なことがありますが、十分実用になるはずです。

    Convert C# to VB.NET
    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    2013年10月21日 3:02
  • 検証してみました

    コメントアウトした方がRequest.Formから取得する方法、コメントアウトしていない方がFindする方法です。

    当然といえば当然なのですが、今回Labelの値も欲しかったのでRequest.Formから取得するとTextBoxやLabelは取得できたのですが、LabelについてはFindControlする必要があるので、追記の方法で実装します。

    aspx
            <Columns>
                <asp:TemplateField FooterText=" " HeaderText="XXXX" InsertVisible="False" SortExpression="XXXX">
                    <EditItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("XXXX")%>'></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Bind("XXXX")%>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField FooterText=" " HeaderText="ID" SortExpression="YYYY">
                    <EditItemTemplate>
                        <asp:Label ID="Label10" runat="server" Text='<%# Bind("YYYY")%>'></asp:Label>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:Label ID="Label15" runat="server" Text='<%# Bind("YYYY")%>'></asp:Label>
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label12" runat="server" Text='<%# Bind("YYYY")%>'></asp:Label>
                    </ItemTemplate>
                    <ControlStyle Width="90px" />
                </asp:TemplateField>
                <asp:TemplateField FooterText=" " HeaderText="種別" SortExpression="ZZZZ">
                    <EditItemTemplate>
                            <asp:DropDownList ID="DropDownList1" Name="ZZZZ" runat="server">
                                <asp:ListItem Text="SYS" Value="SYS" />
                                <asp:ListItem Text="APL" Value="APL" />
                                <asp:ListItem Text="DB" Value="DB" />
                                <asp:ListItem Text="DATA" Value="DATA" />
                            </asp:DropDownList>
                    </EditItemTemplate>
                    <FooterTemplate>
                            <asp:DropDownList ID="DropDownList3" Name="ZZZZ" runat="server">
                                <asp:ListItem Text="SYS" Value="SYS" />
                                <asp:ListItem Text="APL" Value="APL" />
                                <asp:ListItem Text="DB" Value="DB" />
                                <asp:ListItem Text="DATA" Value="DATA" />
                            </asp:DropDownList>
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label6" runat="server" Text='<%# Bind("ZZZZ")%>'></asp:Label>
                    </ItemTemplate>
                    <ControlStyle Width="90px" />
                </asp:TemplateField>
                
    (省略)            
                
    
            <EmptyDataTemplate>
                <table style="width:100%;">
                    <tr>
                        <th style="background-color:#5D7B9D"><b><font color="#FFFFFF">ID</font></b></th>
                        <td style="background-color:#5D7B9D"><b><font color="#FFFFFF">種別</font></b></td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Label ID="Label15" runat="server" Name="backupid"></asp:Label>
                        </td>
                        <td>
                            <asp:DropDownList ID="DropDownList3" Name="ZZZZ" runat="server">
                                <asp:ListItem Text="SYS" Value="SYS" />
                                <asp:ListItem Text="APL" Value="APL" />
                                <asp:ListItem Text="DB" Value="DB" />
                                <asp:ListItem Text="DATA" Value="DATA" />
                            </asp:DropDownList>
                        </td>
    
    
    
    aspx.vb
            If e.CommandName = "Insert" Then
                SqlDataSource1.InsertParameters.Clear()
                SqlDataSource1.InsertParameters.Add("Srvinfid", Session("Srvinfid"))
    
                'For Each key As String In Request.Form.AllKeys
                '    If key.Contains("$Label15") Then
                '        SqlDataSource1.InsertParameters.Add(New ControlParameter("Buid", TypeCode.[String], key, "Text"))
                '    End If
                '    If key.Contains("$DropDownList3") Then
                '        SqlDataSource1.InsertParameters.Add(New ControlParameter("Buclass", TypeCode.[String], key, "Text"))
                '    End If
                'Next
    
                SqlDataSource1.InsertParameters.Add(New ControlParameter("Buid", TypeCode.String, FindControlRecursive(GridView1, "Label15").UniqueID, "Text"))
                SqlDataSource1.InsertParameters.Add(New ControlParameter("Buclass", TypeCode.String, FindControlRecursive(GridView1, "DropDownList3").UniqueID, "Text"))
    

    長々とお付き合いいただきありがとうございました。

    2013年10月23日 1:14

すべての返信

  • 確認させて下さい。タイトルにはGridViewとありますが、ご質問の本文ではDataGridとあります。どちらが正しいのでしょうか?

    #ShowHeaderWhenEmptyとありますので、おそらくGridViewだと思うのですが・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


    2013年10月18日 0:09
    モデレータ
  • trapemiyaさん

    ご指摘の通りGridViewの表記ミスでした。すみません

        <asp:GridView horizontalalign="Center" ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" DataKeyNames="xxxxxxxx" DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None" style="text-align: center" AllowPaging="True" AllowSorting="True" ShowFooter="True" ShowHeaderWhenEmpty ="true">
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
            <Columns>
                <asp:TemplateField FooterText=" " HeaderText="xxxxxxxx" SortExpression="xxxxxxxx">
                    <EditItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("xxxxxxxx")%>'></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Bind("xxxxxxxx")%>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
    ・
    ・
    ・
    ・
    ・
                <asp:TemplateField FooterText=" " ShowHeader="False" ItemStyle-Wrap="false">
                    <EditItemTemplate>
                        <asp:Button ID="Button1" runat="server" CausesValidation="True" CommandName="Update" Text="更新" />
                        &nbsp;<asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:Button ID="InsertSystem" runat="server" CommandName="Insert" Text="追加" />
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Button ID="Button1" runat="server" CausesValidation="False" CommandName="Edit" Text="変更" />
                        <asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Delete" Text="削除" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField FooterText=" " ShowHeader="False" ItemStyle-Wrap="false">
                    <EditItemTemplate>
                        <asp:Button ID="Button1" runat="server" CausesValidation="True" CommandName="Update" Text="更新" />
                        &nbsp;<asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Cancel" Text="キャンセル" />
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:Button ID="InsertSystem" runat="server" CommandName="Insert" Text="追加" />
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Button ID="Button1" runat="server" CausesValidation="False" CommandName="Edit" Text="変更" />
                        <asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Delete" Text="削除" />
                    </ItemTemplate>
                </asp:TemplateField>
    ・
    ・
    ・
    ・
            </Columns>
            <EditRowStyle BackColor="#999999"/>
            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#E9E7E2" />
            <SortedAscendingHeaderStyle BackColor="#506C8C" />
            <SortedDescendingCellStyle BackColor="#FFFDF8" />
            <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
        </asp:GridView>
    
    

    aspxのソースは上記のような感じです。

    フッターに新規データの追加を表示しているのですが、データが0件の時に追加ができなくて困っています・・

    2013年10月18日 1:08
  • いくつか方法があります。

    1.EmptyDataTemplateを使う方法

    これが一番お手軽ですが、GridViewに表示する列が変更になった時、EmptyDataTemplateも忘れずに修正しなければならないことがネックです。

    DISPLAY GRIDVIEW WITH EMPTY MESSAGE AND HEADER AND FOOTER WHEN NO DATA IN ASP.NET
    http://www.aspsnippets.com/Articles/Display-GridView-with-Empty-Message-and-Header-and-Footer-when-no-data-in-ASP.Net.aspx

    2.レコードが無いなら追加してしまおうという方法

    理にかなってますが、以下の例ではブランク行を追加しているため、AutoGenerateColumnsプロパティがfalse、つまり自分で列を設定している場合、バインディングでエラーになる場合があるでしょう。この場合、適当な値の入った行を追加してバインドさせ、その後、GridViewの1行目、つまりこの追加した行のVisibleをfalseにして非表示にするとうまく行くかもしれません。

    How to Display ASP.NET GridView Header and Footer When No Data is Present?
    http://dotnetspidor.blogspot.jp/2008/07/how-to-display-gridview-header-and.html

    Show Header and Footer of GridView when no Data returned.
    http://geekswithblogs.net/dotNETvinz/archive/2009/03/11/tiptrick-show-header-and-footer-of-gridview-when-no-data.aspx

    3.GridViewをサブクラス化して、コードでHeader & Footerを追加する方法

    Empty Grid View with Header & Footer
    http://www.dotnetspider.com/resources/38045-Empty-Grid-View-with-Header-Footer.aspx


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年10月18日 2:43
    モデレータ
  • そもそも GridView には INSERT の機能はないということはご存知ですよね?

    サーバーコントロールにもとから備わっている機能以上のことをしようとすると、とたんに敷居が高くなりますし、予期せぬ問題も起こりやすいです。

    なので、GridView と同等な表形式で INSERT 機能も持っている ListView を使用することをお勧めします。

    ShowHeaderWhenEmpty プロパティが使えるということは ASP.NET 4 以上のはずで、ListView(ASP.NET 3.5 以降)は使用できますよね?

    何らかの理由があって ListView は使用できず、どうしても GridView ということなら、以下のページに、 GridView での INSERT の実現方法およびデータが存在しない場合の対応例がありますので、参考にしてみてください。

    GridViewからデータを追加する
    http://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/

    #質問の際には、何を開発しようとしているか(最初の質問では、Windows アプリなのか Web アプリなのかも分かりません)、ご自分の環境(OS, IIS, .NET, Visual Studio のバージョン、使用しているブラウザなど)を明記してください。


    #質問の内容に適切なフォーラムを選んでください。この内容ですと、ASP.NET のフォーラムの方が良いと思います。
    2013年10月18日 4:09
  • trapemiyaさん、SurferOnWwwさん

    ありがとうございます

    一応GridViewのEmptyDataTemplateを利用することにしました。

    ListViewを使っていない理由はSortしたいからなのですが、ListViewでも実はSort出来るのかもしれませんね・・

    ただ次の問題がでてしまってもっと困っています

    今度はEmptyDataTemplateの中にTextBoxを埋め込んだのですが、この埋め込んだコントロールから値が取得できずに困っています。

    FooterLowの時は

    SqlDataSource1.InsertParameters.Add("Clientname", CType(GridView1.FooterRow.FindControl("TextBox2"), TextBox).Text)

    で取得できたのですが・・・

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36589&forum=7

    できそうな感じもあったのですが、リンク先が消失していました・・

    2013年10月18日 14:22
  • > ListViewを使っていない理由はSortしたいからなのですが、ListViewでも
    > 実はSort出来るのかもしれませんね・・

    ListView でも、もちろんソートはできます。

    ListView でソート(行の並び替え)
    http://surferonwww.info/BlogEngine/post/2012/05/26/Sorting-on-ASPNET-ListView.aspx


    > 今度はEmptyDataTemplateの中にTextBoxを埋め込んだのですが、この埋め込
    > んだコントロールから値が取得できずに困っています。

    私が先のレスで紹介したページの通り実装しようとしているのでしょうか? それとも別のやり方ですか?

    できませんだけでは分かりません。何を期待して、それを実現するのにどうしたのか、その結果どうなったのかを具体的に書いてください。

    2013年10月18日 16:06
  • SurferOnWwwさん

    ご紹介いただいたURL

    GridViewからデータを追加する を参考に以下のコードを組みましたが、FindControlRecursiveがNothingを返してきてうまくいっていません。

    C#からVBに書き換えたのですが、書き換え方が悪かったのか、そもそも他の所が違うのかの見当さえついていない感じです。

    遅くなりましたが、環境などを書きます。

    OS:Windows7(32bit)

    開発環境:VisualStudioExpressForWeb(2012)

    データベース:SQLServer2008

    IIS7.0

    ASP4.5

    です

    期待している結果は、下記コードのEmptyDataTemplateに設定した各Textbox2と3の値をaspx.vbで取得してSQLのパラメータに使いたい状況です。

    また、現在このコードではオブジェクトにNothingが返ってきてExceptionとなっています。

    <<aspx>>
            <EmptyDataTemplate>
                <table style="width:100%;">
                    <tr>
                        <th style="background-color:#5D7B9D"><b><font color="#FFFFFF">ホスト名</font></b></th>
                        <td style="background-color:#5D7B9D"><b><font color="#FFFFFF">クライアント名</font></b></td>
                        <td style="background-color:#5D7B9D"><b><font color="#FFFFFF"></font></b></td>
                    </tr>
                    <tr>
                        <td>
                            <asp:TextBox ID="TextBox3" runat="server" MaxLength="32"></asp:TextBox>
                        </td>
                        <td>
                            <asp:TextBox ID="TextBox2" runat="server" MaxLength="64"></asp:TextBox>
                        </td>
                        <td>
                            <asp:Button ID="Button3" runat="server" CommandName="Insert" Text="追加" />
                        </td>
                    </tr>
                </table>
            </EmptyDataTemplate>
    
    
    
    <<aspx.vb>>
    
        Protected Sub GridView1_RowCommand(sender As Object, e As GridViewCommandEventArgs) Handles GridView1.RowCommand
    		If e.CommandName = "Insert" Then
    		            SqlDataSource1.InsertParameters.Add(New ControlParameter("Hostname", TypeCode.String, FindControlRecursive(GridView1, "TextBox3").UniqueID, "Text"))
    		            SqlDataSource1.InsertParameters.Add(New ControlParameter("Clientname", TypeCode.String, FindControlRecursive(GridView1, "TextBox2").UniqueID, "Text"))
    		            SqlDataSource1.Insert()
    		            Response.Redirect("xxxxxx.aspx")
    		End If
        ・
        以下省略
        ・
    	End Sub
    
    
        Protected Function FindControlRecursive(Root As Control, Id As String) As Control
            If Root.ID = Id Then
                Return Root
            End If
    
            For Each Ctl As Control In Root.Controls
                Dim FoundCtl As Control
                FoundCtl = FindControlRecursive(Ctl, Id)
                If FoundCtl Is Nothing Then
                    FindControlRecursive = FoundCtl
                End If
            Next
            Return Nothing
        End Function
    

    2013年10月21日 2:22
  • 【追記】

    すいません、コード色々変更した後だったので1行間違いがありました

    If FoundCtl Is Nothing Then ではなく

      If FoundCtl Is Not Nothing Then

    結果は同じになっています。

    2013年10月21日 2:27
  • 何度もすみません。

    できました。

    VBに変換したソースが間違っていました。

            For Each Ctl As Control In Root.Controls
                Dim FoundCtl As Control
                FoundCtl = FindControlRecursive(Ctl, Id)
                If FoundCtl IsNot Nothing Then
                    Return FoundCtl
                End If
            Next
    
    FindControlRecursive = FoundCtl

    としていて、即時リターンするようになっていたのを書き換え間違いしていました。

    変更したソースではうまく取れるようになりました。

    稚拙な質問の内容で回答くださったSurferOnWwwさん、trapemiyaさん ありがとうございました。

    2013年10月21日 3:00
  • なぜ GridView1_RowCommand メソッドを紹介したページのサンプルコード(追記ではない方。即ち下記)のようにしないのですか?

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
        if (e.CommandName == "Insert") 
        { 
            SqlDataSource1.InsertParameters.Clear(); 
            foreach (string key in Request.Form.AllKeys) 
            { 
                if (key.Contains("$InsertUserName")) 
                    SqlDataSource1.InsertParameters.Add(new ControlParameter("userName", TypeCode.String, key, "Text")); 
                if (key.Contains("$InsertMailAddress")) 
                    SqlDataSource1.InsertParameters.Add(new ControlParameter("mailAddress", TypeCode.String, key, "Text")); 
            } 
            SqlDataSource1.Insert(); 
        } 
    }
    

    自分でもこのコードで検証してみましたが結果 OK でした。上記のコードに習って書けば FindControl や FindControlRecursive メソッドで探す必要はないはずです。

    上記のコードのようにできない理由があれば、それをきちんと書いてください。


    C# が読めなくて VB.NET に正確に直せないということなら、以下のサイトで C# を VB.NET に変換するサービスが提供されているので、使ってみてはいかがですか。完璧とまでは行かなくて多少手直しが必要なことがありますが、十分実用になるはずです。

    Convert C# to VB.NET
    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    2013年10月21日 3:02
  • SurfOnWwwさん

    上記の追記でない方法では、一度できなかったので追記の方のやり方にしてみました。

    (おそらく出来るのでしょうが、とりあえず出来たので深く追求していません)

    もう少し落ち着いたら検証してみます。その際に回答マークもつけさせていただこうと思います。

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

    2013年10月21日 8:56
  • > 上記の追記でない方法では、一度できなかったので追記の方のやり方にしてみました。

    そういうことはきちんと書いていただければと思います。

    ここは技術者同士の情報交換の場所で、質問者さんと回答者の間はもちろん、他の閲覧者にもどのように解決したかが分かるように書くのが基本と考えていただければと思います。

    2013年10月21日 9:37
  • 検証してみました

    コメントアウトした方がRequest.Formから取得する方法、コメントアウトしていない方がFindする方法です。

    当然といえば当然なのですが、今回Labelの値も欲しかったのでRequest.Formから取得するとTextBoxやLabelは取得できたのですが、LabelについてはFindControlする必要があるので、追記の方法で実装します。

    aspx
            <Columns>
                <asp:TemplateField FooterText=" " HeaderText="XXXX" InsertVisible="False" SortExpression="XXXX">
                    <EditItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("XXXX")%>'></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Bind("XXXX")%>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField FooterText=" " HeaderText="ID" SortExpression="YYYY">
                    <EditItemTemplate>
                        <asp:Label ID="Label10" runat="server" Text='<%# Bind("YYYY")%>'></asp:Label>
                    </EditItemTemplate>
                    <FooterTemplate>
                        <asp:Label ID="Label15" runat="server" Text='<%# Bind("YYYY")%>'></asp:Label>
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label12" runat="server" Text='<%# Bind("YYYY")%>'></asp:Label>
                    </ItemTemplate>
                    <ControlStyle Width="90px" />
                </asp:TemplateField>
                <asp:TemplateField FooterText=" " HeaderText="種別" SortExpression="ZZZZ">
                    <EditItemTemplate>
                            <asp:DropDownList ID="DropDownList1" Name="ZZZZ" runat="server">
                                <asp:ListItem Text="SYS" Value="SYS" />
                                <asp:ListItem Text="APL" Value="APL" />
                                <asp:ListItem Text="DB" Value="DB" />
                                <asp:ListItem Text="DATA" Value="DATA" />
                            </asp:DropDownList>
                    </EditItemTemplate>
                    <FooterTemplate>
                            <asp:DropDownList ID="DropDownList3" Name="ZZZZ" runat="server">
                                <asp:ListItem Text="SYS" Value="SYS" />
                                <asp:ListItem Text="APL" Value="APL" />
                                <asp:ListItem Text="DB" Value="DB" />
                                <asp:ListItem Text="DATA" Value="DATA" />
                            </asp:DropDownList>
                    </FooterTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label6" runat="server" Text='<%# Bind("ZZZZ")%>'></asp:Label>
                    </ItemTemplate>
                    <ControlStyle Width="90px" />
                </asp:TemplateField>
                
    (省略)            
                
    
            <EmptyDataTemplate>
                <table style="width:100%;">
                    <tr>
                        <th style="background-color:#5D7B9D"><b><font color="#FFFFFF">ID</font></b></th>
                        <td style="background-color:#5D7B9D"><b><font color="#FFFFFF">種別</font></b></td>
                    </tr>
                    <tr>
                        <td>
                            <asp:Label ID="Label15" runat="server" Name="backupid"></asp:Label>
                        </td>
                        <td>
                            <asp:DropDownList ID="DropDownList3" Name="ZZZZ" runat="server">
                                <asp:ListItem Text="SYS" Value="SYS" />
                                <asp:ListItem Text="APL" Value="APL" />
                                <asp:ListItem Text="DB" Value="DB" />
                                <asp:ListItem Text="DATA" Value="DATA" />
                            </asp:DropDownList>
                        </td>
    
    
    
    aspx.vb
            If e.CommandName = "Insert" Then
                SqlDataSource1.InsertParameters.Clear()
                SqlDataSource1.InsertParameters.Add("Srvinfid", Session("Srvinfid"))
    
                'For Each key As String In Request.Form.AllKeys
                '    If key.Contains("$Label15") Then
                '        SqlDataSource1.InsertParameters.Add(New ControlParameter("Buid", TypeCode.[String], key, "Text"))
                '    End If
                '    If key.Contains("$DropDownList3") Then
                '        SqlDataSource1.InsertParameters.Add(New ControlParameter("Buclass", TypeCode.[String], key, "Text"))
                '    End If
                'Next
    
                SqlDataSource1.InsertParameters.Add(New ControlParameter("Buid", TypeCode.String, FindControlRecursive(GridView1, "Label15").UniqueID, "Text"))
                SqlDataSource1.InsertParameters.Add(New ControlParameter("Buclass", TypeCode.String, FindControlRecursive(GridView1, "DropDownList3").UniqueID, "Text"))
    

    長々とお付き合いいただきありがとうございました。

    2013年10月23日 1:14
  • 2, 3 コメントさせてください。

    > 今回Labelの値も欲しかったのでRequest.Formから取得するとTextBoxやLabelは取得できたのですが、

    上記は矛盾してますよね。書き間違いでしょうか。

    Label は html にレンダリングされると span 要素になるので、その Label.Text の値(sapn 要素の innerText)はポストバックしてもサーバーに送信されません。なので Request.Form からは取得できません。(ただし、ViewState には保持されているので、ポストバックすると ViewState に含めてサーバーに送信されますが)


    > LabelについてはFindControlする必要があるので、追記の方法で実装します。

    Label ではユーザーは入力できませんから、ポストバック前後で Label.Text の値は同じになるはずです。初期画面を表示した時にすでに分かっている値を、わざわざ FindControl で Label コントロールを探して取得する必要はないと思いますが。


    > <FooterTemplate>
    >   <asp:Label ID="Label15" runat="server" Text='<%# Bind("YYYY")%>'></asp:Label>
    > </FooterTemplate>

    フッターにはバインドするデータはないので、上記コードは意味がないです。表示するだけなら (INSERT 操作をしないなら)エラーは出ないと思いますが、空白が表示されるだけなので Text='<%# Bind("YYYY")%>' は意味がなさそうです。

    2013年10月23日 3:34
  • >> 今回Labelの値も欲しかったのでRequest.Formから取得するとTextBoxやLabelは取得できたのですが、

    >上記は矛盾してますよね。書き間違いでしょうか。

    Labelは書き間違いです。Labelは取得できませんでした。

    Labelの値は元画面で表示しているものなので、わざわざ取得しなくても取れそうですが、このコードでページを複数作成してしまったので、このままにしておきます。FindCtrolにかかるコストがもったいないという話もありますが、厳密にそれほどシビアなものではないのでよしとします。

    >> <FooterTemplate>
    >>   <asp:Label ID="Label15" runat="server" Text='<%# Bind("YYYY")%>'></asp:Label>
    >> </FooterTemplate>

    >フッターにはバインドするデータはないので、上記コードは意味がないです。表示するだけなら (INSERT 操作をしないなら)エラーは出ないと思いますが、空白が表示されるだけなので Text='<%# Bind("YYYY")%>' は意味がなさそうです。

    確かに意味が無いですね。これは削るだけなので削ろうと思います。


    2013年10月23日 11:33