質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

9519閲覧

EmptyDataTemplate内のコントロールの取得方法

nac

総合スコア7

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2016/07/04 06:45

編集2016/07/11 09:44

###前提・実現したいこと
EmptyDataTemplate内のコントロールの取得方法が知りたい。

イベント内のGridViewCommandEventArgsオブジェクトからのアクセスでなく
GridviewRowオブジェクトからのアクセスが希望です。
よろしくお願いします

###試したこと
NETで調べた以下をやっても該当のコントロールは取得できずNothingがもどってきました。
GridView1.Controls[0].Controls[0].FindControl("TextBox1");

<asp:GridView ID="gv1" runat="server" AutoGenerateColumns="False" GridLines="None" UseAccessibleHeader="False" Width="100%" BorderColor="#8D001C" BorderWidth="1px" ShowHeaderWhenEmpty="True"> <AlternatingRowStyle Wrap="False" /> <Columns> <asp:TemplateField ShowHeader="False"> <HeaderTemplate> <asp:Button ID="btnAddNew" runat="server" Text="Button" /> </HeaderTemplate> <ItemTemplate> <asp:Button ID="btnDelGv" runat="server" CausesValidation="false" CommandName="RowDelete" Text="削除" TabIndex="-1" CssClass="btn"/> </ItemTemplate> <ItemStyle VerticalAlign="Top" /> </asp:TemplateField> <asp:TemplateField HeaderText="連番"> <ItemTemplate> <asp:TextBox ID="ScSeq" runat="server" Text='<%# Bind("ScSeq")%>' Columns="1" TabIndex="-1"></asp:TextBox> </ItemTemplate> <ItemStyle VerticalAlign="Top" /> </asp:TemplateField> </Columns> <EmptyDataTemplate> <asp:Label ID="lblGridHeader" runat="server" Text="" CssClass="lblGridHeader"></asp:Label> <asp:Button ID="btnAddFirstRow" runat="server" CssClass="btn" OnClick="btnAddFirstRow_Click" Text="行追加" /> </EmptyDataTemplate> <HeaderStyle BackColor="#8D001C" BorderColor="#8D001C" BorderWidth="1px" ForeColor="White" HorizontalAlign="Left" Wrap="False" /> <RowStyle BorderColor="#BD284C" Wrap="False" /> <SelectedRowStyle BackColor="#64FFFF" /> </asp:GridView>
Protected Sub gv_RowCommand(sender As Object, e As GridViewCommandEventArgs) Handles gv1.RowCommand, gv2.RowCommand, gv3.RowCommand If gv1.Rows.Count = 0 Then Dim obj As Object = gv1.Controls(0).Controls(0).FindControl("btnAddFirstRow") obj.focus() End If End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

GridView1.Controls[0].Controls[0].FindControl("TextBox1");
このやり方で合ってると思いますけどねえ?

とりあえず手元にあった動いているコードを載せときます。
VBですが読めると思います。
tEmpCDという名のTextBoxコントロールを取得しています。
データがゼロ件のときは EmptyDataTemplate が表示されていて、1件以上のときは FooterTemplate が表示されているので、データ件数により取得元を変えています。

HTML

1<asp:GridView ID="EditList" runat="server" ForeColor="#333333" 2 GridLines="Vertical" AutoGenerateColumns="False" ShowFooter="True" AllowSorting="True"> 3 <FooterStyle BackColor="#339933" Font-Bold="True" ForeColor="White" /> 4 <RowStyle BackColor="White" /> 5 <Columns> 6 <asp:TemplateField HeaderText="担当者コード" SortExpression="EMPCD_OLD"> 7 <ItemTemplate> 8 <asp:Label ID="lEmpCD" runat="server" Text='<%# Bind("EMPCD_NEW", "{0:00}") %>'></asp:Label> 9 </ItemTemplate> 10 <EditItemTemplate> 11 <asp:TextBox ID="tEmpCD" runat="server" Text='<%# Bind("EMPCD_NEW", "{0:00}") %>' CssClass="BoxNum3"></asp:TextBox> 12 </EditItemTemplate> 13 <FooterTemplate> 14 <asp:TextBox ID="tEmpCD" runat="server" CssClass="BoxNum3"></asp:TextBox> 15 </FooterTemplate> 16 </asp:TemplateField> 17 <asp:TemplateField ShowHeader="False"> 18 <ItemTemplate> 19 <asp:Button ID="bUpdate" runat="server" CausesValidation="False" 20 CommandName="Edit" Text="編集" /> 21 &nbsp;<asp:Button ID="bDelete" runat="server" CausesValidation="False" 22 CommandName="Delete" Text="削除" /> 23 </ItemTemplate> 24 <EditItemTemplate> 25 <asp:Button ID="bUpdate" runat="server" CausesValidation="True" 26 CommandName="Update" Text="登録" /> 27 &nbsp;<asp:Button ID="bCancel" runat="server" CausesValidation="False" 28 CommandName="Cancel" Text="キャンセル" /> 29 </EditItemTemplate> 30 <FooterTemplate> 31 <asp:Button ID="bInsert" runat="server" CommandName="AddNew" Text="新規登録" /> 32 </FooterTemplate> 33 </asp:TemplateField> 34 </Columns> 35 <EmptyDataTemplate> 36 <table style="width:100%;" border="1" cellspacing="0" 37 rules="cols"> 38 <tr class="InsertHD" align="center"> 39 <td>担当者コード</td> 40 <td>&nbsp;</td> 41 </tr> 42 <tr class="InsertIT"> 43 <td align="center"> 44 <asp:TextBox ID="tEmpCD" runat="server" CssClass="BoxNum3"></asp:TextBox> 45 </td> 46 <td> 47 <asp:Button ID="bInsert" runat="server" CommandName="AddNew" Text="新規登録" /> 48 </td> 49 </tr> 50 </table> 51 </EmptyDataTemplate> 52</asp:GridView>

VB.NET

1Protected Sub EditList_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles EditList.RowCommand 2 If e.CommandName = "AddNew" Then 3 Dim txtEmpCD As TextBox 4 If EditList.Rows.Count = 0 Then 5 ' EmptyDataTemplate 6 txtEmpCD = DirectCast(EditList.Controls(0).Controls(0).FindControl("tEmpCD"), TextBox) 7 Else 8 ' FooterTemplate 9 txtEmpCD = DirectCast(EditList.FooterRow.FindControl("tEmpCD"), TextBox) 10 End If 11 End If 12End Sub

投稿2016/07/11 08:42

twck

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nac

2016/07/11 09:47

ご回答ありがとうございます。 HeaderにbtnAddNewを追加しRowcommandでもやってみましたが、やはりオEmptyDataTemplateのオブジェクト(btnAddFirstRow)が得られずNullReferenceExceptionになってしまいました。 (コード参照ください)
twck

2016/07/11 13:06

もしかしてFindControlしている時点でGridViewにデータがバインドされていないか、データが1件以上あるんじゃないでしょうか? WEBブラウザ上でボタンをクリックされてサーバーにPostBackしたとき、GridViewのデータは初期化されているので、Form_InitイベントやFrom_Loadイベントでデータの再バインドが必要となるのですが、それは行っていますか? GridViewにデータをバインドしているコードが提示されてないので分かりませんが、とりあえずFindControlの前でデバッグして、gv1.DataSourceプロパティの中身が入っているかの確認と、gv1.Rows.Countがゼロかどうかを確認してください。 解決しない場合は、GridViewにデータをバインドしているコードとイベント名を見せてください。
twck

2016/07/16 00:40

5日経ったけど、もう見てないのかな?それとも諦めたのかな?
nac

2018/10/25 01:08

再バインドもしてますしgv1.Rows.Countは0になっていました。できないものと諦めます。
nac

2018/10/25 01:09

なれないもので長い間見ることなく放置してすいませんでした。今後気を付けます。
guest

0

GridViewでループ回したりすると思うのですが、以下サイト等参考になると思います。
「GridView」「FindControl」で検索するといろいろ出てきます。
GridViewでTemplateFieldの値の取得について

ASP.net

1CType(GridView1.FindControl("TextBox1"), TextBox).Text;

投稿2016/07/04 07:35

tomato-salada

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nac

2016/07/04 07:42

ご回答ありがとうございます。 EmptyDataTemplateだけその方法ではできないようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問