2011-03-31 43 views
3

我以下面的方式定義了一個嵌套網格視圖。有關asp.net/C中嵌套網格視圖的查詢#

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" OnRowDataBound="GridView1_RowDataBound" GridLines="None"> 
    <Columns> 
     <asp:BoundField DataField="Date Of Transaction" HeaderText="Date Of Transaction" 
      SortExpression="Date Of Transaction" /> 
     <asp:BoundField DataField="Invoice Number" HeaderText="Invoice Number" SortExpression="Invoice Number" /> 
     <asp:BoundField DataField="totalAmount" HeaderText="totalAmount" ReadOnly="True" 
      SortExpression="totalAmount" /> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:GridView ID="gridView2" runat="server" HorizontalAlign="Left" ShowHeader="false" GridLines="None" OnRowDataBound="gridView2_RowDataBound"> 
       <Columns> 
       <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="100px"> 
       <ItemTemplate> 
       <asp:Button ID="Btn1" runat="server" Text="Download" OnClick="Btn1_Click"/> 
       </ItemTemplate> 
       </asp:TemplateField> 
       </Columns> 
       </asp:GridView> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ComponentDBConnectionString %>" 
    SelectCommand="SelectUserPreviousHistory" SelectCommandType="StoredProcedure"> 
    <SelectParameters> 
     <asp:Parameter DefaultValue="XYZZ" Name="userName" Type="String" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

輸出的屏幕截圖是here。正如你所看到的,我在子gridview的每一行(即gridView2)中都有一個「下載」按鈕,但我希​​望下載按鈕成爲最後一列,但.net會將其渲染爲第一列。

我該怎麼辦?

更多關於gridview2 datasource是arraylist。下面是代碼

gridView2.DataSource = titlesArrayList; 
gridView2.DataBind(); 

請幫我在期待

回答

5

感謝你爲什麼不乾脆在ItemTemplate的Donwload-按鈕前添加一個Label?您可以在RowDataBound(gridView2_DataBound)中設置標籤的文本。

編輯:爲了在外部網格視圖的標題中顯示嵌套網格視圖的標題列,您可以在內部網格中設置ShowHeader="false",並使用帶有兩個標籤的HeaderTemplate作爲「Software Titles」和「Download here」 CSS-Styles適合內部網格。

編輯

這裏是工作的測試頁。挑選部分,你不明白:

ASPX

<asp:GridView ID="GrdTransaction" runat="server" OnRowDataBound="GrdTransaction_RowDataBound" AutoGenerateColumns="false"> 
     <Columns> 
     <asp:BoundField DataField="DateOfTransaction" HeaderText="Date Of Transaction" 
      SortExpression="DateOfTransaction" /> 
     <asp:TemplateField> 
      <HeaderTemplate> 
       <table width="100%" cellspacing="0" cellpadding="0" border="0"> 
        <tr> 
         <td><asp:Label ID="LblFileNameHeader" Text="File-Name" runat="server" /></td><td><asp:Label ID="LblDownloadHeader" Text="Download file" runat="server" /></td> 
        </tr> 
       </table> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <asp:GridView ID="GrdDocument" runat="server" ShowHeader="false" GridLines="None" AutoGenerateColumns="false" 
        OnRowCommand="GrdDocument_RowCommand" OnRowDataBound="GrdDocument_RowDataBound"> 
        <Columns> 
        <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="100px"> 
         <ItemTemplate> 
          <asp:Label ID="LblFileName" Text='<%# Eval("Doc")%>' runat="server" /> 
         </ItemTemplate> 
        </asp:TemplateField> 
        <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="100px"> 
         <ItemTemplate> 
          <asp:Button ID="BtnDownload" runat="server" CommandArgument='<%# Eval("Doc")%>' CommandName="Download" Text="Download" /> 
         </ItemTemplate> 
        </asp:TemplateField> 
        </Columns> 
       </asp:GridView> 
      </ItemTemplate> 
     </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

代碼隱藏(從vb.net轉換爲C#):

public class WebForm1 : System.Web.UI.Page 
{ 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) { 
      this.GrdTransaction.DataSource = GetOuterGridSource(); 
      this.GrdTransaction.DataBind(); 
     } 
    } 

    private DataTable GetOuterGridSource() 
    { 
     DataTable tbl = new DataTable(); 
     tbl.Columns.Add(new DataColumn("ID", typeof(Int32))); 
     tbl.Columns.Add(new DataColumn("DateOfTransaction", typeof(DateTime))); 
     DataRow row = tbl.NewRow(); 
     row["ID"] = 1; 
     row["DateOfTransaction"] = System.DateTime.Now; 
     tbl.Rows.Add(row); 
     row = tbl.NewRow(); 
     row["ID"] = 2; 
     row["DateOfTransaction"] = System.DateTime.Now; 
     tbl.Rows.Add(row); 
     row = tbl.NewRow(); 
     row["ID"] = 2; 
     row["DateOfTransaction"] = System.DateTime.Now; 
     tbl.Rows.Add(row); 
     return tbl; 
    } 

    private DataTable GetNestedGridSource() 
    { 
     DataTable tbl = new DataTable(); 
     tbl.Columns.Add(new DataColumn("ID", typeof(Int32))); 
     tbl.Columns.Add(new DataColumn("Doc", typeof(string))); 
     DataRow row = tbl.NewRow(); 
     row["ID"] = 1; 
     row["Doc"] = "Smart Defrag"; 
     tbl.Rows.Add(row); 
     row = tbl.NewRow(); 
     row["ID"] = 2; 
     row["Doc"] = "Visio Viewer"; 
     tbl.Rows.Add(row); 
     row = tbl.NewRow(); 
     row["ID"] = 2; 
     row["Doc"] = "Rapid Typing"; 
     tbl.Rows.Add(row); 
     return tbl; 
    } 

    protected void GrdTransaction_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) { 
      dynamic row = ((DataRowView)e.Row.DataItem).Row; 
      dynamic GrdDocument = (GridView)e.Row.FindControl("GrdDocument"); 
      GrdDocument.DataSource = GetNestedGridSource(); 
      GrdDocument.DataBind(); 
      GrdDocument.RowCommand += GrdDocument_RowCommand; 
     } 
    } 

    protected void GrdDocument_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) { 
      dynamic row = ((DataRowView)e.Row.DataItem).Row; 
      dynamic LblFileName = (Label)e.Row.FindControl("LblFileName"); 
      LblFileName.Text = row("Doc").ToString; 
     } 
    } 

    protected void GrdDocument_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e) 
    { 
     if (e.CommandName == "Download") { 
      dynamic docName = e.CommandArgument.ToString(); 
     } 
    } 
    public WebForm1() 
    { 
     Load += Page_Load; 
    } 
} 

我已經設置了LblFileName的文本屬性GrdDocument_RowDataBound。這是多餘的,因爲我總是在aspx頁面上使用eval。爲了完整性,我想展示兩種方式。

這是結果:

enter image description here

+0

@Tim我還有一個問題,如果你想我可以單獨發佈,取決於你的決定,但它是一種相關的。如果你看看輸出截圖(EDITED !!)。 http://postimage.org/image/1c9ru8q84/父網格視圖中沒有標題的最後一列。我可以爲父網格視圖設置標題,如預期的輸出屏幕截圖 – 2011-03-31 12:56:35

+0

@user所示:編輯我的答案。 – 2011-03-31 14:42:42

+0

@Tim你的想法的標題列工作,但我一直在努力與RowDataBound(gridView2_DataBound)方法。我無法理解它。我在gridview1 rowdatabound事件上創建了gridview2。更多的是我根據每個gridview1特定行的發票號碼過濾gridview2中的數據(請再次參考屏幕截圖)。我如何創建標籤並將其綁定到數據源 – 2011-03-31 18:06:51

1

在gridView2,設置的AutoGenerateColumns = 「假」,並添加一個ASP:ASP的前綁定列:模板列

你確定沒有失蹤代碼在你的片段?

<asp:GridView ID="gridView2" runat="server" HorizontalAlign="Left" ShowHeader="false" GridLines="None" OnRowDataBound="gridView2_RowDataBound" AutoGenerateColumns="False"> 
       <Columns> 

       <asp:BoundField HeaderText="" DataField="ToString" /> 


       <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="100px"> 
       <ItemTemplate> 
       <asp:Button ID="Btn1" runat="server" Text="Download" OnClick="Btn1_Click"/> 
       </ItemTemplate> 
       </asp:TemplateField> 
       </Columns> 
       </asp:GridView> 
+0

@ DavRob60我在我的問題中添加了額外的代碼!我添加了用於父級gridview'(即gridview1)數據庫連接的行。如果這就是你丟失代碼的含義? – 2011-03-31 13:02:10

+0

@ user653622是 – DavRob60 2011-03-31 13:21:36

+0

@ DavRob60所以我應該如何處理asp:BoundField?你能爲我詳細闡述一下嗎? – 2011-03-31 13:38:50