Печать Gridview - как напечатать n строк на каждой странице, используя разрыв страницы
У меня есть сетка с 30 строками. Я хочу напечатать его на 3 страницах по 10 строк на каждой. Я пробовал этот код.
foreach (GridViewRow row in GridView1.Rows)
{
if (row.RowIndex % 10 == 0 && row.RowIndex != 0)
{
row.Attributes["style"] = "page-break-after:always;";
}
}
Но он печатает всю страницу без каких-либо разрывов страниц. Я использовал для вызова функции печати с использованием JavaScript(показано ниже).
function PrintGridData() {
var prtGrid = document.getElementById('<%=GridView1.ClientID %>');
prtGrid.border = 0;
//GridView1.Attributes(style) = "page-break-after:always"
var prtwin = window.open('', 'PrintGridViewData', 'left=100,top=100,width=1000,height=1000,tollbar=0,scrollbars=1,status=0,resizable=1');
prtwin.document.write(prtGrid.outerHTML);
prtwin.document.close();
prtwin.focus();
prtwin.print();
prtwin.close();
}
Помогите???
С уважением...
Я показываю свою полную разметку ниже.. пожалуйста, проверьте это..
<%@ Page Title="About Us" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="About.aspx.cs" Inherits="WebApplication2.About" EnableEventValidation="false" %>
<%@ Register assembly="Shared.WebControls" namespace="Shared.WebControls" tagprefix="cc1" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>
About
</h2>
<script type="text/javascript">
function PrintGridData() {
var prtGrid = document.getElementById('<%=ReportGridView1.ClientID %>');
//window.print();
prtGrid.border = 0;
//GridView1.Attributes(style) = "page-break-after:always"
var prtwin = window.open('', 'PrintGridViewData', 'left=100,top=100,width=1000,height=1000,tollbar=0,scrollbars=1,status=0,resizable=1');
prtwin.document.write(prtGrid.outerHTML);
prtwin.document.close();
prtwin.focus();
prtwin.print();
prtwin.close();
}
</script>
<p>
<asp:Button ID="Button1" runat="server" Text="Button"
onclick="Button1_Click" OnClientClick="PrintGridData()"/>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px"
CellPadding="4" DataKeyNames="ID" DataMember="DefaultView"
ForeColor="Black" GridLines="None"
ShowFooter="True" style="margin-left: 0px; margin-right: 0px; margin-top: 3px;"
Width="965px"
ShowHeaderWhenEmpty="True"
EnableTheming="True" onrowcreated="GridView1_RowCreated"
onrowdatabound="GridView1_RowDataBound">
<AlternatingRowStyle BackColor="White" BorderStyle="Solid" />
<Columns>
<asp:TemplateField ConvertEmptyStringToNull="False" HeaderText="Select">
<ItemTemplate>
<asp:CheckBox ID="chkrow" runat="server" AutoPostBack="True"
TabIndex="1" ToolTip="Select" />
</ItemTemplate>
<HeaderTemplate>
<asp:CheckBox ID="chkhead" runat="server" />
</HeaderTemplate>
</asp:TemplateField>
<asp:CommandField ButtonType="Button" HeaderText="Edit" ShowEditButton="True">
<ControlStyle CssClass="classname" />
</asp:CommandField>
<asp:TemplateField HeaderText="First Name">
<ItemTemplate>
<asp:Label ID="lblfirstname" runat="server" Text='<%# Eval("First_name") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txteditfirstname" runat="server"
Text='<%# Eval("First_name") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Second Name">
<ItemTemplate>
<asp:Label ID="lblsecondname" runat="server" Text='<%# Eval("Second_name") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txteditsecondname" runat="server"
Text='<%# Eval("Second_name") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="DOB">
<ItemTemplate>
<asp:Label ID="lbldob" runat="server" Text='<%# Eval("DOB") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txteditdob" runat="server" Text='<%# Eval("DOB") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Address">
<ItemTemplate>
<asp:Label ID="lbladdress" runat="server" Text='<%# Eval("Address") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txteditaddress" runat="server" Text='<%# Eval("Address") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="PIN">
<EditItemTemplate>
<asp:TextBox ID="txteditpin" runat="server" Text='<%# Eval("PIN") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblpin" runat="server" Text='<%# Eval("PIN") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Contact No">
<ItemTemplate>
<asp:Label ID="lblcontactno" runat="server" Text='<%# Eval("Contact_no") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txteditcontactno" runat="server"
Text='<%# Eval("Contact_no") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="E-mail">
<ItemTemplate>
<asp:Label ID="lblemail" runat="server" Text='<%# Eval("E_mail")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txteditemail" runat="server" Text='<%# Eval("E_mail") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="#CCCC99" />
<HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
<PagerSettings Visible="False" />
<PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
<RowStyle BackColor="#F7F7DE" />
<SelectedRowStyle BackColor="#CE5D5A" CssClass="SelectedRowStyle"
Font-Bold="True" ForeColor="White" />
<SortedAscendingCellStyle BackColor="#FBFBF2" BorderStyle="Double" />
<SortedAscendingHeaderStyle BackColor="#848384" />
<SortedDescendingCellStyle BackColor="#EAEAD3" />
<SortedDescendingHeaderStyle BackColor="#575357" />
</asp:GridView>
</p>
Помогите???
2 ответа
if (!IsPostBack)
{
var sb = new StringBuilder();
string s;
show();
for (int i = 0; i < GridView1.PageCount; i++)
{
GridView1.FooterRow.Visible = false;
GridView1.PageIndex = i + 1;
sb.Clear();
GridView1.RenderControl(new HtmlTextWriter(new StringWriter(sb)));
s = sb.ToString();
Response.Write(s);
if (i != GridView1.PageCount - 1)
{
Response.Write("<p></p>");
}
show();
}
GridView1.Visible = false;
}
public override void VerifyRenderingInServerForm(Control control)
{
}
I have used this method to solve the case..I have applied paging to the **gridview** and it works!!!
CSS-разрыва страницы после не работает кросс-браузер
Я проверял page-break-after: always;
с ie10 и firefox 22 - работает в обоих; в Chrome 30 это не работает. Поэтому трудно сказать, почему он не работает для вас в Firefox 22.
Если ваша пользовательская база в основном IE и Firefox (как в нашей компании). Это будет работать:
.pagebreak {
page-break-after: always;
}
По-видимому, поддержка css pagebreak не идеальна:
Поиск проблем с Chrome привел меня к проблеме 99124. - Напечатанное содержимое таблицы не учитывает свойства CSS разрыва страницы; сообщили 4 октября 2011 года и до сих пор не подверглись воздействию: Confirmed, not reviewed for priority and assignment
, Кажется, что печать просто не важна.
Добавление этого CSS также не помогло:
@media print
{
table tr.pagebreak {page-break-after:always}
}
Обновлено - патченный обходной путь с использованием Javascript
Обходным путем может быть разделение таблицы на несколько таблиц - для каждой страницы. Эта демонстрация разбивает одну таблицу на n таблиц после того, как пользователь нажимает кнопку. Вам нужен этот CSS hr {page-break-after: always;}
также.
Я обновил JavaScript, чтобы включить <hr />
между каждой страницей, чтобы заставить Chrome добавить разрыв страницы.
function printTable(){
var tables = createTables(2);
$("#printTables").html(tables);
}
function createTables(rowsPerTable){
var rowsInParentTable = $( "tbody tr" ).toArray();
var subTable = "<table>", subRows=[], sr = 0;
for(i=0; i < rowsInParentTable.length; i++){
subTable += "<tr>" + rowsInParentTable[i].innerHTML + "</tr>";
if( i % rowsPerTable === 0 && (i > rowsPerTable || i +1 > rowsPerTable ){
subTable += "</table> <hr /><table>";
}
}
return subTable;
}
И HTML
<div>
<table id="sourceTable">
<tbody>
<tr><td>1 Browser</td>
<td>Version</td>
<td>Support for 'page-break-after' </td></tr>
<tr><td>2 Internet Explorer</td>
<td>10</td><td>works for table rows</td></tr>
<tr><td>3 Fire Fox</td><td>22</td>
<td>works for table rows</td></tr>
<tr><td>4 Chrome</td><td>30</td>
<td>does not work</td></tr>
<tr><td>5 Safari</td><td>?</td><td>?</td></tr>
<tr><td>6 Opera</td><td>?</td><td>?</td></tr>
</tbody>
</table>
<button onclick="printTable()">print table</button>
</div>
<div id="printTables">
</div>
Моя рекомендация
Я хотел бы создать отдельную страницу aspx, которая заботится о печати страницы. Таким образом, вы получите полный контроль на стороне сервера и сможете использовать ретранслятор для создания именно нужного HTML-вывода.