Answered by:
How to find child view outside rowdatabound

Question
-
User-172769993 posted
I have tow grid views master grid is gridpurchase and child grid is gvItems
I am trying to hide some columns in gvItems when exporting the grids to excel file.
i have tried the below code but it didn't work
Exporting code
protected void btnexcel_Click(object sender, EventArgs e) { gridpurchase.DataSource = po.GetPurchaseOrders(); gridpurchase.DataBind(); GridView gvItems = gridpurchase.FindControl("gvItems") as GridView; gvItems.Columns[0].Visible = false; gridpurchase.GridLines = GridLines.Both; foreach (GridViewRow row in gridpurchase.Rows) { foreach (TableCell cell in row.Cells) { for (int i = cell.Controls.Count - 1; i >= 0; i--) { if (cell.Controls[i] is Image) { Image img = cell.Controls[i] as Image; if (img.ImageUrl.Contains("plus.png") || img.ImageUrl.Contains("minus.png")) { cell.Controls.RemoveAt(i); } } } } } gridpurchase.Caption = "Purchase Orders Report"; System.Web.HttpContext curContext = System.Web.HttpContext.Current; System.IO.StringWriter strWriter = null; System.Web.UI.HtmlTextWriter htmlWriter = null; curContext.Response.Clear(); curContext.Response.Buffer = true; curContext.Response.AddHeader("content-disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode("PurchaseOrdersReport", System.Text.Encoding.UTF8) + ".xls"); curContext.Response.ContentType = "application/vnd.ms-excel"; curContext.Response.Write("<meta http-equiv=Content-Type content=text/html;charset=UTF-8>"); strWriter = new System.IO.StringWriter(); htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter); gridpurchase.RenderControl(htmlWriter); curContext.Response.Write(strWriter.ToString()); curContext.Response.End(); }
Grid-view
<asp:GridView ID="gridpurchase" OnRowCommand="gridpurchase_RowCommand" OnRowDataBound="gridpurchase_RowDataBound" DataKeyNames="RequisitionID" GridLines="None" runat="server" CssClass="table text-nowrap" AutoGenerateColumns="False"> <Columns> <asp:TemplateField HeaderText="Preview"> <ItemTemplate> <asp:Image ID="imgPlus" runat="server" AlternateText="" ImageUrl="img/plus.png" Style="cursor: pointer" /> <asp:Panel ID="pnlproducts" runat="server" Style="display: none"> <asp:GridView ID="gvItems" CssClass="table table-bordered" runat="server" AutoGenerateColumns="false"> <Columns> <asp:BoundField DataField="ItemName" HeaderText="Item Name" SortExpression="ItemName" /> </Columns> </asp:GridView> </asp:Panel> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="SupplierName" HeaderText="Supplier Name" SortExpression="SupplierName" /> <asp:BoundField DataField="PurchaseOrderCode" HeaderText="Purchase Order Code" SortExpression="PurchaseOrderCode" /> </Columns> </asp:GridView>
Friday, August 12, 2016 6:44 PM
Answers
-
User283571144 posted
Hi asp.net4,
I have tow grid views master grid is gridpurchase and child grid is gvItems
I am trying to hide some columns in gvItems when exporting the grids to excel file.
i have tried the below code but it didn't work
According to your codes and description, I had written a test demo on my computer.
After I used VS debugger, I found 'gvItems' had null value, so you can't achieve hiding some columns in 'gvItems'.
GridView gvItems = gridpurchase.FindControl("gvItems") as GridView;
I suggest you could use foreach method to loop 'gridpurchase' rows first.
In each row's cells, you could use 'FindControl' method to find the 'gvItems', then set its columns visible to false.
More details, you could refer to follow codes:
HTML:
<asp:GridView ID="gridpurchase" runat="server" AutoGenerateColumns="False" DataKeyNames="id" DataSourceID="SqlDataSource1"> <Columns> <asp:TemplateField HeaderText="City"> <ItemTemplate> <asp:Panel ID="pnlproducts" runat="server" > <asp:GridView ID="gvItems" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" DataSourceID="SqlDataSource2"> <Columns> <asp:BoundField DataField="Id" HeaderText="Id" ReadOnly="True" SortExpression="Id" /> <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" /> </Columns> </asp:GridView> </asp:Panel> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True" SortExpression="id" /> <asp:BoundField DataField="name" HeaderText="name" SortExpression="name" /> <asp:BoundField DataField="password" HeaderText="password" SortExpression="password" /> <asp:BoundField DataField="CityId" HeaderText="CityId" SortExpression="CityId" /> </Columns> </asp:GridView> <br /> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MysqlConnectionString2 %>" SelectCommand="SELECT * FROM [Userinfo]"></asp:SqlDataSource> <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:MysqlConnectionString2 %>" SelectCommand="SELECT * FROM [City]"></asp:SqlDataSource> <hr/> <asp:Button ID="Button1" runat="server" Text="ToExcel" OnClick="Button1_Click" />
Code-behind:
protected void Button1_Click(object sender, EventArgs e) { //GridView gvItems = gridpurchase.FindControl("gvItems") as GridView; foreach (GridViewRow row in gridpurchase.Rows) { GridView gvItems = row.Cells[0].FindControl("gvItems") as GridView; gvItems.Columns[0].Visible = false; } }
Best Regards,
Brando
- Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
Saturday, August 13, 2016 2:45 AM