0

我有一个 GridView 包含 Formview,如:

<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当数据源返回零记录时使用。它用于显示诸如“未找到记录”之类的消息。如果要对控件进行数据绑定,请在 RowDataBoundEvent 上使用Templatefield& fetch 控件。FindControl

于 2013-03-25T08:40:23.833 回答