2011-08-17 101 views
0

我有一個GridView這樣ASP.NET動態添加一個GridView

<asp:GridView runat="server" ID="gvShoppingCart" AutoGenerateColumns="false" EmptyDataText="There is nothing in your shopping cart." AlternatingRowStyle-CssClass="tr_dark" HeaderStyle-CssClass="header_req" BorderWidth="0px" GridLines="None" AllowPaging="true" PageSize="25" AllowSorting="false" Width="100%" ShowFooter="true" DataKeyNames="ProductId" OnRowDataBound="gvShoppingCart_RowDataBound" OnRowCommand="gvShoppingCart_RowCommand"> 

    <Columns>       
      <asp:TemplateField HeaderText="Product Name" SortExpression="productName" HeaderStyle-CssClass="product" > 
       <ItemTemplate> 
       <asp:Label ID="ProductNameField" runat="server" Text='<%# Eval("description").ToString() %>'></asp:Label> 
       </ItemTemplate>      
      </asp:TemplateField> 

    </Columns> 
    <Columns>       
      <asp:TemplateField HeaderText="Pack Size" SortExpression="packSize" HeaderStyle-CssClass="packsize" > 
       <ItemTemplate> 
       <asp:Label ID="PackSizeField" runat="server" Text='<%# Eval("packSize").ToString()%>'></asp:Label> 
       </ItemTemplate>      
      </asp:TemplateField> 

    </Columns> 
    <Columns>       
      <asp:TemplateField HeaderText="Stock" SortExpression="address" HeaderStyle-CssClass="stock"> 
       <ItemTemplate> 
       <asp:Label ID="StockField" runat="server" Text='<%# DisplayStockLevel(Eval("StockIndicator").ToString()) %>'></asp:Label> 
       </ItemTemplate>      
      </asp:TemplateField> 

    </Columns> 
    <Columns> 
    <asp:TemplateField HeaderText="Quantity" HeaderStyle-CssClass="quantity" > 
     <ItemTemplate> 
      <asp:TextBox runat="server" Width="30" ID="txtQuantity" Text='<%# Eval("Quantity") %>'></asp:TextBox> 
      <asp:TextBox runat="server" Visible="false" Width="30" ID="txtProductCode" Text='<%# Eval("ProductCode") %>'></asp:TextBox> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 

    <Columns> 
    <asp:TemplateField HeaderText="Actual Price" HeaderStyle-CssClass="actual" SortExpression="address"> 
       <ItemTemplate> 
       <asp:Label ID="TradePriceField" runat="server" Text='<%# DisplayMoney(Eval("UnitPrice").ToString())%>'></asp:Label> 
       <asp:Label ID="TradePriceFieldHidden" runat="server" Text='<%# Eval("UnitPrice").ToString()%>' Visible="false"></asp:Label> 
       </ItemTemplate>      
      </asp:TemplateField> 
    </Columns> 
    <Columns> 
    <asp:BoundField DataField="TotalPrice" HeaderText="Total" HeaderStyle-CssClass="total" HeaderStyle-HorizontalAlign="Right" DataFormatString="{0:C}" /> 
    </Columns> 
    <Columns> 
    <asp:TemplateField HeaderText="" HeaderStyle-CssClass="remove"> 
    <ItemTemplate> 
     <asp:ImageButton ImageUrl="~/img/icons/cross.gif" width="10" height="10" alt="Cancel" runat="server" ID="btnRemove" CommandName="Remove" CommandArgument='<%# Eval("ProductId") %>'/> 
    </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 

現在試圖動態添加頁腳行(因爲我需要多尾行)

Protected Sub gvShoppingCart_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles gvShoppingCart.RowDataBound 
    ' If we are binding the footer row, let's add in our total 
    If e.Row.RowType = DataControlRowType.Footer Then 
     e.Row.Cells(5).Text = "<strong>Total Cost:</strong>" 
     e.Row.Cells(6).Text = ShoppingCart.Instance.GetSubTotal().ToString("C") 
    End If 

    Dim grid As GridView = CType(sender, GridView) 

    ''gets the current footer row to clone 
    Dim footer As GridViewRow = grid.FooterRow 
    Dim numCells = footer.Cells.Count 

    Dim newRow As New GridViewRow(footer.RowIndex + 1, -1, footer.RowType, footer.RowState) 

    ''have to add in the right number of cells 
    ''this also copies any styles over from the original footer 
    For i As Integer = 0 To numCells - 1 
     Dim emptyCell As New TableCell 
     emptyCell.ApplyStyle(grid.Columns(i).ItemStyle) 

     newRow.Cells.Add(emptyCell) 
    Next 

    newRow.Cells(5).Text = "Total Discount:" 
    newRow.Cells(6).Text = "55.00" 

    ''add new row to the gridview table, at the very bottom 
    CType(grid.Controls(0), Table).Rows.Add(newRow) 

End Sub 

但是得到錯誤

未將對象引用設置爲對象的實例。

昏暗numCells = footer.Cells.Count

任何想法什麼問題呢?

回答

0

只有在調用RowDataBound方法後才設置GridView FooterRow屬性。您可以在GridView的DataBound方法中訪問它。

Protected Sub gvShoppingCart_DataBound(ByVal sender As Object, ByVal e As EventArgs) 
     Dim footerRow as GridViewRow = gvShoppingCart.FooterRow 
End Sub 
0

首先您的GridView標記不正確。定義Columns就是這樣。

<asp:GridView ID="gvShoppingCart" runat="server" 
     AlternatingRowStyle-CssClass="tr_dark" 
     AllowPaging="true" 
     AllowSorting="false" 
     AutoGenerateColumns="false" 
     BorderWidth="0px" 
     DataKeyNames="ProductId" 
     EmptyDataText="There is nothing in your shopping cart." 
     GridLines="None" 
     HeaderStyle-CssClass="header_req" 
     PageSize="25" 
     ShowFooter="true" 
     Width="100%" 
     OnRowCommand="gvShoppingCart_RowCommand" 
     OnRowDataBound="gvShoppingCart_RowDataBound"> 
    <Columns> 
     <asp:TemplateField HeaderText="Product Name" SortExpression="productName" HeaderStyle-CssClass="product"> 
      <ItemTemplate> 
       <asp:Label ID="ProductNameField" runat="server" 
         Text='<%# Eval("description").ToString() %>'> 
       </asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Pack Size" SortExpression="packSize" HeaderStyle-CssClass="packsize"> 
      <ItemTemplate> 
       <asp:Label ID="PackSizeField" runat="server" 
         Text='<%# Eval("packSize").ToString()%>'> 
       </asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Stock" SortExpression="address" HeaderStyle-CssClass="stock"> 
      <ItemTemplate> 
       <asp:Label ID="StockField" runat="server" 
         Text='<%# DisplayStockLevel(Eval("StockIndicator").ToString()) %>'> 
       </asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Quantity" HeaderStyle-CssClass="quantity"> 
      <ItemTemplate> 
       <asp:TextBox ID="txtQuantity" runat="server" 
         Width="30" 
         Text='<%# Eval("Quantity") %>'> 
       </asp:TextBox> 
       <asp:TextBox ID="txtProductCode" runat="server" 
         Visible="false" 
         Width="30" 
         Text='<%# Eval("ProductCode") %>'> 
       </asp:TextBox> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Actual Price" HeaderStyle-CssClass="actual" SortExpression="address"> 
      <ItemTemplate> 
       <asp:Label ID="TradePriceField" runat="server" 
         Text='<%# DisplayMoney(Eval("UnitPrice").ToString())%>'> 
       </asp:Label> 
       <asp:Label ID="TradePriceFieldHidden" runat="server" 
         Text='<%# Eval("UnitPrice").ToString()%>' 
         Visible="false"> 
       </asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="TotalPrice" HeaderText="Total" 
      HeaderStyle-CssClass="total" HeaderStyle-HorizontalAlign="Right" 
      DataFormatString="{0:C}" /> 
     <asp:TemplateField HeaderText="" HeaderStyle-CssClass="remove"> 
      <ItemTemplate> 
       <asp:ImageButton ID="btnRemove" runat="server" 
        ImageUrl="~/img/icons/cross.gif" 
        Width="10" 
        Height="10" 
        AlternateText="Cancel" 
        CommandName="Remove" 
        CommandArgument='<%# Eval("ProductId") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

其次,由於您尚未在任何地方定義您的FooterTemplate而出現錯誤。

+0

你能告訴我怎麼可以添加一個頁腳行,這將有一些功能做着保護小組gvShoppingCart_RowDataBound(BYVAL發件人爲對象,BYVALË作爲GridViewRowEventArgs)處理gvShoppingCart.RowDataBound 「如果我們結合頁腳如果e.Row.RowType = DataControlRowType.Footer Then e.Row.Cells(5).Text =「Total Cost:」 e.Row.Cells(6).Text = ShoppingCart.Instance.GetAmountSaved()。ToString(「C」) End If End Sub – StevieB

+0

我添加了空的頁腳模板,即 但仍然出現錯誤 – StevieB