I have a custome request to print a gridview with lots of columns, 31
to be exact. I know how to print out a gridview, done it already for
a GV with 6 columns. But, this GV is very wide and will not fit on a
page. I looked into using a repeater, but couldn't figure it out.
Tried datalists, no luck.
Does anybody have an idea of how I can output the data where it will
print. It doesn't have to output into a gridview, I just need it
printable...
Ralf, using Repeater with a nested GridView is quite easy. Here's an
example I used to show list of brochures by categories. The result
list looks in the following way:
Category1
.....col1....col2....col3
.....col1....col2....col3
.....col1....col2....col3
Category 2
.....col1....col2....col3
.....col1....col2....col3
.....col1....col2....col3
This is done by using Repeater with a nested GridView:
<asp:Repeater ID="Repeater1" runat="server"
OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<div>
<asp:Label ID="lblCategoryName" runat="server" Text='<%#
Eval("BrochureCategoryName") %>' />
</div>
<div>
<asp:GridView ID="GridView1" runat="server" DataKeyNames="BrochureId">
<Columns>
<asp:TemplateField>
<ItemTemplate>
....
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</ItemTemplate>
</asp:Repeater>
A code to populate GridView could be as a following
private void BindData()
{
DataSet ds = (DataSet)db.ExecuteDataSet(string.Format(
@"SELECT * FROM BrochureCategory;
SELECT b.* FROM Brochure b, BrochureCategory c
WHERE b.BrochureCategoryId=c.BrochureCategoryId", _websiteId)
);
// Attach the relationship to the dataSet
ds.Relations.Add(new DataRelation("CategoriesRelation",
ds.Tables[0].Columns["BrochureCategoryId"],
ds.Tables[1].Columns["BrochureCategoryId"]));
Repeater1.DataSource = ds.Tables[0];
Repeater1.DataBind();
}
protected void Repeater1_ItemDataBound(object sender,
RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==
ListItemType.AlternatingItem)
{
DataRowView drv = e.Item.DataItem as DataRowView;
GridView GridView1 = e.Item.FindControl("GridView1") as GridView;
GridView1.DataSource = drv.CreateChildView("CategoriesRelation");
GridView1.DataBind();
}
}
When you have many colums you have to find how you could rearrange the
view. Maybe you can follow my example and show one or more "main"
columns as a Repeater data rows and the rest could be nested using a
GridView control.
Category1 Name1 Name2
Description......
.....col1....col2....col3
.....col1....col2....col3
.....col1....col2....col3
or
Category1 Name1 Name2
Description......
.....col1=val1
.....col2=val2
.....col3=val3
.....col4=val4
.....col5=val5