0

次のようなフォームビューを含む GridView があります。

<asp:GridView ID="gv1" runat="server" AutoGenerateColumns="false"
     OnRowCommand="gv1_RowCommand" DataKeyNames="employeeID"
     DataSourceID="ds">
   <EmptyDataTemplate>
       <asp:FormView ID="fv1" runat="server" DataKeyNames="employeeID" 
                     DataSourceID="ds" DefaultMode="Insert">
           <InsertItemTemplate>
               // insert mode table
           </InsertItemTemplate>
           <EditItemTemplate>
              //  edit mode table
           </EditItemTemplate>
      </asp:FormView>
   </EmptyDataTemplate>

   <Columns>
       <asp:TemplateField>
       <HeaderTemplate>
           <asp:Button ID="btnNew" runat="server" Text="New Record" CommandName="New" />
       </HeaderTemplate>
           <ItemTemplate>
           <asp:Button ID="btnEdit" runat="server" Text="Edit" CommandName="Edit" />
       </ItemTemplate>
       </asp:TemplateField>
   </Columns>
</asp:GridView>

私が欲しいのは、ボタンがクリックされたとき、ページに EmptyDataTemplate が表示されるので、コードビハインドで試します:

protected void gv1_RowCommand(object sender, GridViewCommandEventArgs e) {
    switch(e.CommandName){
        case "New":
            gv1.DataSourceID = null;
            break;
        case "Edit":
            var row = ((Control)e.CommandSource).NamingContainer as GridViewRow;
            if (row != null) {
                var fv = row.FindControl("fv1") as FormView;
                fv.ChangeMode(FormViewMode.Edit);
            }
            gv1.DataSourceID = null;
            break;
    }
}

しかし、FormView の取得に行き詰まってしまい、NullReferenceException エラーが発生します。どんな提案でも大歓迎です。

4

2 に答える 2

1

EmptyDataTemplate、データ ソースにバインドされていて、ソースにレコードがない場合にのみ表示されると思います。したがって、記録がある場合は、EmptyDataTemplate決して表示されません。また、データ ソースが空の場合にも、コマンド ボタンのある列が表示されるとは思わないので、あなたがしようとしていることはその方法では実行できません。

新しい行を追加する場所としてグリッド フッターを使用して、レコードの追加機能を提供する人もいます。これを行う方法のスタックオーバーフローの質問と回答(例付き)は次のとおりです。

ASP.net GridView がフッター テンプレートから挿入されない

于 2013-03-24T11:21:24.600 に答える
0

EmptyDataTemplateデータソースがゼロレコードを返す場合に使用されます。「レコードが見つかりません」などのメッセージを表示するために使用されます。コントロールをデータバインドする場合は、RowDataBoundEventTemplatefieldを使用して & フェッチ コントロールを使用します。FindControl

于 2013-03-25T08:40:23.833 に答える