# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > ASP.NET Web Forms > مقاله: پرینت گرفتن از هر قسمت صفحه که مایل باشید C#‎ & VB

## bahar_engineer

برای اینکه بتونین از صفحاتتون پرینت بگیرین به روش زیر اقدام کنید

در این روش از هر کنترلی که توی صفحه داشته باشید می تونین پرینت بگیرید مثل گریدویو ، عکس، جدول و هر چیز دیگه ای

*1.* یک کلاس به وب سایتتون اضافه کنین و نام اون رو PrintHelper  بگذارید
کد زیر رو در اون بنویسید:

*C#‎*
--------------

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text;
using System.Web.SessionState;

public class PrintHelper
{
    public PrintHelper()
    {
    }

    public static void PrintWebControl(Control ctrl)
    {
        PrintWebControl(ctrl, string.Empty);
    }

    public static void PrintWebControl(Control ctrl, string Script)
    {
        StringWriter stringWrite = new StringWriter();
        System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite);
        if (ctrl is WebControl)
        {
            Unit w = new Unit(100, UnitType.Percentage); ((WebControl)ctrl).Width = w;
        }
        Page pg = new Page();
        pg.EnableEventValidation = false;
        if (Script != string.Empty)
        {
            pg.ClientScript.RegisterStartupScript(pg.GetType()  , "PrintJavaScript", Script);
        }
        HtmlForm frm = new HtmlForm();
        pg.Controls.Add(frm);
        frm.Attributes.Add("runat", "server");
        frm.Controls.Add(ctrl);
        pg.DesignerInitialize();
        pg.RenderControl(htmlWrite);
        string strHTML = stringWrite.ToString();
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Write(strHTML);
        HttpContext.Current.Response.Write("<script>window  .print();</script>");
        HttpContext.Current.Response.End();
    }
}
*VB.NET*
--------------

Imports System
 Imports System.Data
 Imports System.Configuration
 Imports System.Web
 Imports System.Web.Security
 Imports System.Web.UI
 Imports System.Web.UI.WebControls
 Imports System.Web.UI.WebControls.WebParts
 Imports System.Web.UI.HtmlControls
 Imports System.IO
 Imports System.Text
 Imports System.Web.SessionState
  
 Public Class PrintHelper
     Public Sub New()
     End Sub
  
     Public Shared Sub PrintWebControl(ByVal ctrl As Control)
         PrintWebControl(ctrl, String.Empty)
     End Sub
  
     Public Shared Sub PrintWebControl(ByVal ctrl As Control, ByVal Script As String)
         Dim stringWrite As StringWriter = New StringWriter()
         Dim htmlWrite As System.Web.UI.HtmlTextWriter = New System.Web.UI.HtmlTextWriter(stringWrite)
         If TypeOf ctrl Is WebControl Then
             Dim w As Unit = New Unit(100, UnitType.Percentage)
             CType(ctrl, WebControl).Width = w
         End If
         Dim pg As Page = New Page()
         pg.EnableEventValidation = False
         If Script <> String.Empty Then
             pg.ClientScript.RegisterStartupScript(pg.GetType()  , "PrintJavaScript", Script)
         End If
         Dim frm As HtmlForm = New HtmlForm()
         pg.Controls.Add(frm)
         frm.Attributes.Add("runat", "server")
         frm.Controls.Add(ctrl)
         pg.DesignerInitialize()
         pg.RenderControl(htmlWrite)
         Dim strHTML As String = stringWrite.ToString()
         HttpContext.Current.Response.Clear()
         HttpContext.Current.Response.Write(strHTML)
         HttpContext.Current.Response.Write("<script>window.print();</script>")
         HttpContext.Current.Response.End()
     End Sub
 End Class

*2.* دو صفحه بسازید default.aspx و print.aspx (این صفحه default همون صفحه ای هست که می خواین اطلاعاتشو پرینت بگیرین و صفحه print هم یه صفحه popup هست که حالت preview رو داره)

*3.* داخل صفحه default.aspx یک پنل قرار بدین (از toolbar یک panel درگ کنید توی صفحه) و هر کنترل یا جدول یا گریدویو ، عکس و هر چیز دیگه ای رو که می خواین ازش پرینت داشته باشین رو توی اون پنل جاسازی و مرتب کنید(دقت کنید تمامی کنترلها و متنهایی که توی پنل قرار می دین پرینت گرفته می شن به همون شکل که شما قرار دادید)

*4.* در صفحه default یک دکمه برای پرینت قرار بدین و نامش رو هم مثلاً پرینت اطلاعات بگذارید و سپس در رویداد کلیک اون کد زیر رو بنویسید:

*C#‎*
-------- 

protected void btnPrint_Click(object sender, EventArgs e)
     {
         Session["ctrl"] = Panel1;
         ClientScript.RegisterStartupScript(this.GetType(), "onclick", "<script language=javascript>window.open('Print.aspx','Prin  tMe','height=300px,width=300px,scrollbars=1');</script>");
     }
*VB.NET
*---------- 

Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click
         Session("ctrl") = Panel1
         ClientScript.RegisterStartupScript(Me.GetType(), "onclick", "<script language=javascript>window.open('Print.aspx','Prin  tMe','height=300px,width=300px,scrollbars=1');</script>")
 End Sub

این کد  اطلاعات مورد نظر رو در سشن ذخیره می کنه و به پنجره POPUP می فرسته و بعد پرینت می گیره ... اگر می خواین مستقیماً پرینت بگیره به جای کدهای بالا این کد رو بنویسید:


PrintHelper.PrintWebControl(Panel1);

*5.* در رویداد page_load صفحه print.aspx کد زیر رو اضافه کنین:

*C#‎*
------------

protected void Page_Load(object sender, EventArgs e)
     {
         Control ctrl = (Control)Session["ctrl"];
         PrintHelper.PrintWebControl(ctrl);
     }*
*

*VB.NET
*------- 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          Dim ctrl As Control = CType(Session("ctrl"), Control)
          PrintHelper.PrintWebControl(ctrl)
  End Sub
 
تموم شد :لبخند: 

حالا اجرا کنید و پرینت بزنید

امیدوارم مفید واقع بشه 

موفق باشید :چشمک:

----------


## iman_ad

ممنون دوست عزیز

----------


## hobab-theme

مرسی
واقعاً به همچین کدی نیاز بود
فقط اگه لطف کنید چه خورده در مورد کلاس پروژه بیشتر توضیح بدید که چکار کردید ممنون میشم ( به خصوص با زبان VB )
موفق باشید :تشویق:

----------


## arhnmn

دوست عزیز من می خوام مدیر سایت که رفت داخل قسمت admin کسانی که ثبت نام کردند رو ببینه داخل یه datagrid بعد از اون پرینت بگیره. از همین کد شما باید استفاده کنم؟؟؟ میشه یکم توضیح بدین!!!

----------


## hobab-theme

> دوست عزیز من می خوام مدیر سایت که رفت داخل قسمت admin کسانی که ثبت نام کردند رو ببینه داخل یه datagrid بعد از اون پرینت بگیره. از همین کد شما باید استفاده کنم؟؟؟ میشه یکم توضیح بدین!!!


 خوب شما گریدتون رو بایند کنید و از همون روشی که خانم bahar_engineer گفتن پیش برید به نتیجه میرسید
برای مشاهده لیست کاربران ثبت نام کرده هم که باید اطلاعات اونها رو از جدول مورد نظر بگیرید و تو گرید بریزید

----------


## bahar_engineer

عذر می خوام سوء تفاهم نشه 

این کد من نیست یعنی من ننوشتمش 

دنبال اینطور پرینتی می گشتم توی یه سایت خارجی پیداش کردم گفتم بذارم بقیه هم فیض ببرند


اما در مورد سوال جناب arhnmn باید به عرض برسونم:
بله . از همین روش می تونین استفاده کنین. شما گریدتون رو به بانک متصل کرده و با مشخصات افرادی که ثبت نام کردند پر کنید بعد به همون شکل یه پنل توی صفحه قرار بدین و گریدتون رو توی اون پنل بذارین و بعد هم پرینت .

----------


## bahar_engineer

حالا کسی هست که بدونه اگه بخوایم تو سایز A4 چاپ کنیم چه باید کرد؟ صفحه من چون در ابعاد 1024*768 هست وقتی چاپ می شه قسمتی از سمت راست صفحه نمی افته ... حتی وقتی pdf می شه

----------


## raziee

ممنون از کدی که گذاشتی.



> این کد من نیست یعنی من ننوشتمش


اخلاق و زفتار درستتون ارزشمنده.
منظورم اینه که مثل بعضی ها کد ها و مقالات دیگران رو به نام خودتون منتشر نکردید.

----------


## iman_ad

فکر نکنم این کاذ برای گزارش گیری مناسب باشه باید از ابزارهای گزارش گیر مثل کریستال استفاده کنی

----------


## bahar_engineer

نه کریستال حجم بالایی داره و برای چنین گزارش ساده ای سنگینه

من فقط می خوام صفحه مو در سایز A4 پرینت بگیرم... البته نهایتا فکر می کنم باید یک جدول توی صفحه بذارم با سایز A4 و به این شکل پرینت بزنم... یا کاری کنم که جدول SCALE بشه به سایز A4

----------


## pooria_kia

سلام ، مرسی از راهنماییتون ،  من می خوام پرینت بگیرم از یک panel ولی نمی خوام print dialog  نمایش داده بشه ، میشه کمکم کنید ؟

----------


## arhnmn

> دو صفحه بسازید default.aspx و print.aspx (این صفحه default همون صفحه ای هست که می خواین اطلاعاتشو *پرینت* بگیرین و صفحه print هم یه صفحه popup هست که حالت preview رو داره)


دوست عزیز من متوجه این قسمت از گفته های شما نشدم.صفحه popupکه حالت preview داره یعنی چی؟؟

----------


## arhnmn

خانوم bahar این طور که من فهمیدم صفحه popup برای نشون دادن متن پرینت هستش که خوب من نمیخوام این باشه.من بقیه مراحل رو انجام دادم ولی متاسفانه Errorمیده .
این خط class printhelper 

frm.Controls.Add(ctrl)

این error رو میده:


> Value cannot be null.
> Parameter name: child


اگر میشه دوستانی که این کد رو اجرا کردن راهنمائیم کنن.مرسی

----------


## arhnmn

ببخشید که من همش پست میزارم .چون آخرین مهلت پروژم و چندتا مشکل اساسی دارم
این خطی که گفتم error میداد یعنی این خط:

frm.Controls.Add(ctrl)
من برای امتحان کردن حذفش کردم ولی یه مشکل دیگه پیش اومد که دیگه اون صفحه ایی که میخوام داخلش یه gridview پرینت بشه نشون داده نمیشه و یکسره میره برای شناسایی پرینتر.
لطفا" کمک کنید

----------


## icegirl_f2r

> شما گریدتون رو به بانک متصل کرده و با مشخصات افرادی که ثبت نام کردند پر کنید بعد به همون شکل یه پنل توی صفحه قرار بدین و گریدتون رو توی اون پنل بذارین و بعد هم پرینت .


میشه مستقیماً هم گرید را به پرینتر فرستاد کافیه در کد زیر به جای panel اسم گریدتون را بزارین
PrintHelper.PrintWebControl(Panel1);
یعنی به این صورت
PrintHelper.PrintWebControl(gridview);

----------


## bahar_engineer

> این کد  اطلاعات مورد نظر رو در سشن ذخیره می کنه و به پنجره POPUP می فرسته و بعد پرینت می گیره ... اگر می خواین مستقیماً پرینت بگیره به جای کدهای بالا این کد رو بنویسید:
> 
> 
> PrintHelper.PrintWebControl(Panel1);


اینجا گفتم که اگه خواستین اون پنجره print preview باز نشه این کد رو به جای کدی که در شماره 4 گفتم قرار بدین

شرمنده من دیگه به این تاپیک سر نزدم ... شاید هم خیلی دیر شده باشه (برای پروژتون می گم)

من خودم الان تست کردم :
برای اینکه اصلا پنجره print نمایش داده نشه به این صورت عمل کنید :
1. توی صفحه default یعنی همون صفحه ای که دکمه پرینت رو قرار دادین کد های رویداد کلیک باتن رو به این صورت تغییر بدین:


Session["ctrl"] = Panel1;
        Control ctrl = (Control)Session["ctrl"];
        PrintHelper.PrintWebControl(ctrl);
        //ClientScript.RegisterStartupScript(this.GetType(), "onclick", "<script language=javascript>window.open('Print.aspx','Prin  tMe','height=500px,width=700px,scrollbars=1');</script>");


همانطور که می بینید خطی که صفحه print رو بوسیله کد جاواسکریپت باز می کرد رو حذف کردیم (من در توضیحات قرار دادمش بوسیله //) 
و کدی که توی صفحه print نوشته بودیم رو به همین رویداد اضافه کردم

حالا می تونین صفحه print رو کلا حذف کنید

برای من که جواب داد

----------


## bahar_engineer

> خانوم bahar این طور که من فهمیدم صفحه popup برای نشون دادن متن پرینت هستش که خوب من نمیخوام این باشه.من بقیه مراحل رو انجام دادم ولی متاسفانه Errorمیده .
> این خط class printhelper 
> 
> frm.Controls.Add(ctrl)این error رو میده:
> 
> اگر میشه دوستانی که این کد رو اجرا کردن راهنمائیم کنن.مرسی


فکر می کنم این خطا برای اینه که شما هیچ کنترلی رو توی سشن نفرستادین

در اینجا کنترل در صفحه پرینت ، اطلاعات خودشو از سشن می گیره و شما صفحه پرینت رو که همون صفحه popup هست حذف کردین پس هیچ اطلاعاتی وجود نداره که بتونی اضافه کنه برای همین null هست مقدار کنترلتون و خطا می ده

----------


## minamorsali

سلام
با تشکر از مقاله خوبتون.
من این روش رو در صفحه ascx استفاده کردم، اما در رویداد کلیک دستور 

ClientScript.RegisterStartupScript(this.GetType(), "onclick", "<script language=javascript>window.open('Print.aspx','Prin  tMe','height=300px,width=300px,scrollbars=1');</script>");

رو نمیشناسه. 
برای حلش چه کار کنم؟
یه سوال دیگه. من از این روش در گزارش گیری استفاده می کنم . اول سر کنترل گرید ویوو ام خالیه و بعد از کلیک دکمه گزارش، داده ها از دیتا بیس وارد گرید ویوو میشه، حالا مشکلم اینه که وقتی دکمه پرینت رو می زنم اطلاعات گرید ویوو ام می پره و در نتیجه صفحه سفید برام چاپ میشه. ممنون میشم اگه راهنماییم کنید.

با تشکر فراوان

----------


## kohyar

سلام
من نتونستم كد رو اجرا كنم
من كلاس PrintHelper رو داخل AppCode ايجاد كردم
*Value cannot be null.
Parameter name: child* 

Line 40:         pg.Controls.Add(frm);
Line 41:         frm.Attributes.Add("runat", "server");
Line 42:         frm.Controls.Add(ctrl);
Line 43:         pg.DesignerInitialize();
Line 44:         pg.RenderControl(htmlWrite);

----------


## L_eskandary

سلام 
دوستان به ما گفتن که از پنل استفاده نکنین چون گاهی وقتا قفل می کنه و مشکلاتی تو بعضی از browser ها پیش میاره ، در مورد این کدها هم که از پنل استفاده کردین ممکن هست از یه ابزار دیگه استفاده شه ، یا اصلا این که از پنل استفاده نکنیم درسته ؟

----------


## hobab-theme

> دوستان به ما گفتن که از پنل استفاده نکنین چون گاهی وقتا قفل می کنه و مشکلاتی تو بعضی از browser ها پیش میاره ، در مورد این کدها هم که از پنل استفاده کردین ممکن هست از یه ابزار دیگه استفاده شه ، یا اصلا این که از پنل استفاده نکنیم درسته ؟


اینو کی گفته ؟
من تاحالا همچین چیزی نشنیدم . اگه که از گفتتون کاملاً مطمئن هستید بگید تا از این به بعد ما هم یه خورده رو استفاده از پنل تامل بیشتری کنیم . ممنون



> من این روش رو در صفحه ascx استفاده کردم، اما در رویداد کلیک دستور 
> 
> کد:
> ClientScript.RegisterStartupScript(this.GetType(), "onclick", "<script language


آره . البته من روز اولی که خانم  bahar_engineer این کد رو قرار دادن من ازش استفاده کردم و 100% جواب میداد
یه مدت مدت بعد واسه خودم که خواستم استفاده کنم دیگه از همین تکه کد ایراد میگیره :متفکر: 
حالا چرا ؟... نمیدونم

----------


## bahar_engineer

من خودم دوباره تست کردم مشکلی نداره 

اینم صفحات شما فقط کدهاشو نگاه کنین چون بانک داره و برای اجرا بهتون خطا می ده

صفحه اصلی من که شامل دکمه پرینته REPORT هست که شامل کدهایی برای ارتباط با بانک اطلاعاتیه و اگه همین صفحه رو اضافه کنین خطا می ده ... شما همینطوری بازش کنین و کدهاشو بردارین که البته همونطوری هست که در ابتدای تاپیک نوشتم

فایل PDF هم نتیجه پرینت هست

صفحه PRINT هم که همون صفحه کذایی پرینته

اون فولدر APP_CODE هم که شامل کلاس PRINTHELPER

----------


## minamorsali

سلام
خیلی خیلی متشکرم به خاطر راهنماییتون.
همون کارهایی که گفتید رو انجام دادم، اما در هنگام اجرا موقعی که روی دکمه پرینت کلیک می کنم ارور :
The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).

رو در خط زیر از برنامه print helper می ده:

frm.Controls.Add(ctrl);


متشکر میشم اگه راهنماییم کنید.

----------


## bahar_engineer

شما چه کنترلی رو می خواین پرینت بگیرین؟

----------


## minamorsali

کنترل گرید ویوو.
راستی یه مورد دیگه اینکه من به برنامه شما که دقت کردم شما قبل از اجرا data sourse اتون و دستور select اتون مشخصه، اما من select ام در زمان اجرا توسط کاربر و پس از زدن دکمه گزارش مشخص میشه.بخاطر همین شاید روش شما جواب نده برای من. شما می دونید من باید چه کنم؟
این روش رو نمیشه بصورت کلاینت ساید پیاده کرد؟
باز هم بخاطر کمک هاتون بی نهایت متشکرم.

----------


## minamorsali

ارورش رو برطرف کردم ، اما باز هم صفحه سفید تحویلم میده....
این روشی که شما گفتین، رو نمیشه بصورت کلاینت ساید بدون رفت و برگشت به سرور انجام داد؟

با تشکر از راهنمایی هاتون خانم bahar_enginer

----------


## Saber_Fatholahi

مرسی. دمت گرم.

----------


## karim orooji

سلام دوست عزیز 
این برنامه شما باید حتما کنترلها در یک panel باشه

----------


## Himalaya

> این روشی که شما گفتین، رو نمیشه بصورت کلاینت ساید بدون رفت و برگشت به سرور انجام داد؟


چرا نمیشه.. اینم روشش
اول در مورد اینکه پنل با بعضی مرورگرها مشکل داره بگم که درسته مشکل داره... مثلا با ورژنهای قدیمی opera فکر کنم ورژن 8 بود که اسکرول نمی گرفت... دقیقا یادم نیست ولی تو ورژنهای بعدی حل شد

دوم در مورد پرینت... فکر میکنم واسه پرینت گرفتن راه خیلی خیلی ساده تری وجود داشته باشه
که من از همین سایت برنامه نویس یاد گرفتم و تا حالا هم هر چی خواستم پرینت بگیرم از این کدها استفاده کردم
مثل صدور کارت امتحانی و برگه اعتراض تو A5 و پرینت نمره ها تو A4
بریم سر اصل مطلب 
تو این روش فقط یه صفحه داریم و احتیاجی هم به کلاس خاصی نیست ... میتونید ار پنل هم استفاده نکنید ... چون ما با جدول کار میکنیم...اما اگه جدولتون ارتفاعش خیلی زیاد بود میتونید جدولو بزارید داخل پنل و به پنل اسکرول بدید...پنل تاثیری تو پرینت ما نداره...چون ما از جدول داخل پنل میخوایم پرینت بگیریم نه خود پنل
اول تمام المانهایی رو که میخواید ازشون پرینت بگیرید بزارید تو یه تیبل و هر جوری که دوست دارید اونها رو تیبل بندی کنید. به اون جدول یه id بدید مثلا pri
بعد بالای این جدول یا هرجایی که توی این جدول نباشه یه دکمه از نوع html ای بزارید
یه چیزی مثل کد زیر

<inputid="Button1"type="button"value="print table"onclick="return CallPrint('pri')"/>


و اسکریپت زیررو هم به قسمت head صفحه اضافه کنید


<script>
function CallPrint(strid)
{
var prtContent = document.getElementById(strid);
var WinPrint = window.open('','','letf=0,top=0,width=720,height=600,margin-left=0,toolbar=0,scrollbars=1,status=0');
WinPrint.document.write(prtContent.outerHTML);
WinPrint.document.close();
WinPrint.print();
WinPrint.close();
returnfalse;
}
</script>


سایز پنجره preview و پرینت تو قسمت اسکریپت تعیین میشه البته به اندازه جدولتون هم مربوطه
اگه همه این چیزا رو با دقت تعیین کنید میبینید که پرینت دقیقا همون جوری میشه که انتظار دارید

----------


## spicirmkh

چطور می توانم یک فایل pdf بدون باز کردن پرینت بگیرم

----------


## saraytanha

سلام دوست من 
مرسی از راه حلی که گذاشتی 
اما من این کد رو تست کردم 
وقتی پنلم رو برای چاپ می فرستم قیافهء پنلم داغون می شه 
و خیلی زشت می شه 
چطور می تونم این مشکل رو حل کنم

----------


## sh_esharif

دوست عزیز سلام
ممنون از کد خوبی که گذاشتید. 
مشگل من اینجاست که در پنل یک جدول با اندازه های درصدی دارم. موقع پرینت این اندازه ها اندازه واقعی نیستن. میشه راه حل ارائه بدین؟
ممنون از وقتی که می گذارین.

----------


## neynavaz

سلام
ممنون از کدی که گذاشتید

من ا زکد اول تاپیک استفاده کردم
اما مشکل اینه که سایز صفحه ای که میخواد پرینت گرفته بشه رو نمیدونم
ضمن اینکه فونت من تو پنل tahoma است و توی چاپ arial 
یعنی کاربر یه چیزی میبینه یه چیز دیگه تو پرینت پرویو میاد!!!
کسی میتونه کمکم کنه؟؟؟؟؟؟؟؟؟؟؟؟؟

----------


## mehran_337

من هم از این کلاس استفاده کردم ما همه رو چپ چین کرده و فونت ها رو بهم ریخته چکار کنم که تنظیمات صفحه همچنان حفظ بشه و با همون استایلی که در صفحه می بینم چاپ بشه؟

----------


## asp2.net

دست شما درد نکنه من این کد را انجام دادم اجرا کرد و هیچ مشکلی نداره ولی چنانچه  صفحه ما یک مسترپچ باشه کار نمیکنه .ایا کسی امتحان کرده و ......من چیکار کنم تا در صفحه مستر پیچ هم مشکل نداشته باشد.

----------


## صادق صدقی

سلامممممم
با این که خودت ننوشتی اما کاره بزرگی انجام دادی

بگزریم
تویه همین تالار
*karaji333*

یک تاپیک زده بود که یک دی ال ال گذاشت .کاره پرینت رو به بهترین نحوه احسنت انجام میده
لینک رو ببینید
اینو نگفتم بی خیال شین
گفتم برید از ش بپرسیدشاید بتونه کمکتون کنه

----------

