2013-03-24 38 views
0

我有一個GridView包含FormView控件,如:如何GridView中EmptyDataTemplate內發現的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錯誤。 任何建議表示讚賞。

+1

任何類型的模板字段都必須放在標籤中。然後在行數據綁定中檢查rowtype。如果它的空然後使用e.row.FindControl方法找到formview。通常,當數據源不包含行並將結果綁定到0行時,將使用此模板。然後顯示空白數據模板。 – 2013-03-24 09:18:57

回答

1

我相信EmptyDataTemplate只顯示當你已經綁定到數據源,並且源中沒有記錄。所以如果你有任何記錄,你的EmptyDataTemplate將永遠不會顯示。我不相信帶有命令按鈕的列會在數據源爲空時顯示,因此您試圖執行的操作不能以這種方式完成。

有些人通過使用網格頁腳作爲添加新行的位置來提供添加記錄功能。這裏有一個如何做一個堆棧溢出問題和回答(用一個例子):

ASP.net GridView not Inserting from Footer Template

0

EmptyDataTemplate當數據源返回零個記錄時使用。它用於顯示諸如「找不到記錄」之類的消息。如果要數據綁定控件,請在RowDataBoundEvent上使用FindControl使用Templatefield &提取控件。

相關問題