PDA

View Full Version : خبر: دانلود کنید:کامپوننت پرینت از هر قسمت از صفحه



Himalaya
چهارشنبه 28 مهر 1389, 21:53 عصر
سلام به همگی
دیدم تو یه تاپیک خانوم bahar... یه روش واسه پرینت گرفتن از المانهای صفحه گفتن ولی بعضی از بچه ها با ست کردن استایل روی خروجی مشکل دارن. گفتم این کنترل رو ایجاد کنم که یه قسمتی از اون مشکل رفع بشه و طرز استفاده هم راحتتر بشه، تنها کاری که شما باید انجام بدید اینه که فقط باید یه نمونه از این کامپوننت رو از تولباکس رو صفحه قرار بدبد و id کنترلی که میخواید ازش پرینت بگیرید رو تو پراپرتی های این کامپوننت ست کنید
تو این کنترل از jquery برای پرینت گرفتن استفاده کردم . خوب بریم سراغ چند تا نکته
واسه اینکه ظاهر پرینت دقیقا بشه همونی که میخواید >>>
نکته 1. همونطوری که میدونید ما استایل رو به 3 صورت میتونیم تعریف کنیم
الف. external که از طریق تگ link تو header به صفحه میشناسونیم. مثلا


<linkrel="Stylesheet"media="all"href="StyleSheet1.css"/>
ب. inline که به این صورت تو خود تگ تعریف میشه


<divstyle="background-color:Yellow;font-family:Tahoma;">

ج. حالت سوم که تو header تعریف میشه و به وسیله خصوصیت class یا cssClass به روی تگ مورد نظر اعمال میشه. اینطوری



<style>.myStyle { background-color:Blue; font-family:Tahoma; }</style>
<divclass="myStyle">...</div>

این کامپوننت قادره هر 3 نوع استایل رو تشخیص بده و اونا رو تو خروجی (preview و پرینت) اعمال کنه. مورد اول و دوم هیچ مشکلی ندارن ولی اگه خواستید از مورد سوم استفاده کنید و استایلتون رو پرینت تاثیر داشت حتما استایل مورد نظر رو تو یه استایل خارجی قرار بدید و اون رو از طریق تگ link به صفحه معرفی کنید (مشابه روش الف)

نکته 2. کنترلی که میخواید ازش پرینت بگیرید باید id اون کنترل رو تو خصوصیت ControlID این کامپوننت قرار بدید. هیچوقت کنترل مورد نظر برای پرینت رو به صورت مستقیم جهت پرینت گرفتن نفرستید. منظورم اینه که اون کنترل (یا کنترلها) رو که میخواید ازشون پرینت بگیرید داخل یه تگ div قرار بدید و به اون تگ دیو یه id بدید و این id رو برای پرینت گرفتن به کامپوننت معرفی کنید.
یه مثال میزنم تا مطلب روشن بشه


فرض کنید کنترلی که میخوایم ازش پرینت بگیریم یه گرید باشه که ظاهرش اینطوریه

پلاگین jquery برای پرینت به این صورت عمل میکنه >>>

یه صفحه وب میسازه به این صورت . اول استایلهایی که به صورت link تعریف شدن از header تشخیص میده و تو هدر صفحه جدید قرار میده (تو حالت popup این صفحه دیده میشه ولی تو iframe نه. ولی روال کار تو هر دو یکی هستش) بعد میاد تگ مربوط به id که برای پرینت بهش معرفی کردیم رو پیدا میکنه و از اون تگ فقط و فقط خصوصیات style , CssClass , Class رو تشخیص میده و تو body صفحه جدید یه تگ div ایجاد میکنه و این خصوصیات رو به اون نسبت میده . (دوباره تاکید میکنم که کنترلی که برای پرینت توسط id بهش معرفی میکنیم از تگ ابتداییش فقط و فقط خصوصیات style,cssClass,Class شناخته میشن). تگهای داخلی به هر صورتی میتونن باشن و مشکلی ندارن.
با این تفاسیر اگه id مربوط به گرید رو واسه پرینت به این کنترل معرفی کنیم ظاهر پرینت
و preview میشه این


که گفتم باید چیکارش کنیم (استفاده از یه تگ div که یه id داشته باشه (این تک میتونهstyle , CssClass , Class رو هم داشته باشه) و قرار دادن تمام المانهایی که میخوایم ازشون پرینت بگیریم داخل این تگ div و معرفی این id به کامپوننت جهت گرفتن پرینت. یعنی به جای اینکه id گرید زیر رو واسه پرینت بفرستید




<asp:GridViewID="GridView1"runat="server"BackColor="#F7F7F7"/>
............
</asp:GridView>




id تگ div زیر رو براش بفرستید




<divid="printID"class="myStyle"style="background-color:Blue;">
<asp:GridViewID="GridView1"runat="server"BackColor="#F7F7F7"/>
............
</asp:GridView>
</div>

بین این تگ div هر چی باشه ازش پرینت گرفته میشه (من اینجا فقط گرید رو قرار دادم. ممکنه 100 تا المان دیگه هم بین اون وجود داشته باشه)

اما نحوه استفاده از این کنترل. این کنترل رو به تولباکستون اضافه کنید. بعد یه نمونه از اون رو روی صفحه قرار بدید. (ترجیحا بالاتر از کنترلی که میخواید ازش پرینت گرفته بشه، یا بلافاصله بعد از تگ form) پراپرتی هاش میشه مثل این عکس

خوب تو قسمت ControlID باید ID کنترلی که میخواید ازش پرینت بگیرید رو قرار بدید. بقیه خصوصیات هم مشخصه .فقط اگه قسمت PrintMode برابر popup باشه پنجره preview باز میشه و اگه رو iframe باشه پنجره preview بازنمیشه و مستقیم پنجره پرینت باز میشه.

بعد یه دکمه میزارید رو صفحه و تو ایونت کلیک اون ، این خط رو قرار میدید





Print1.PrintControl();

یه پروژه هم ضمیمه کردم. اون رو هم ببینید. اینم یه عکس از پرینتی که توسط همین پروژه گرفتم.
دیتابیس : Access با 3 تا رکورد و استفاده از کنترل FormView جهت گرفتن اطلاعات هر دانشجو

ff3.5 -- Safari4 -- Avant11 -- Chrome3 -- Netscape Navigator 9 -- ie8
تو ie7 فقط حالت popup

printControl رو که دانلود کردید dll داخل اون رو تو پوشه bin از پروژه studentCart جایگزین کنید

majnun
پنج شنبه 29 مهر 1389, 02:37 صبح
1- کامپوننت شما در google chorme کار نمیکنه

2- وقتی در ie ازش استفاده میکنیم در واقع انگار همون تابع windows.print رو صدا میزنه و کل صفحه پرینت گرفته میشه

ولی برای fire fox پرینت محشری میگیره من خودم حال کردم خروجی خیلی خوبی داده

3- میشه کدشو هم بزارید ببینیم چجوری نوشته شده ؟ اگه براتون مقدوره بزارید تا آموزشی برای ما باشه

ممنون

aserfg
پنج شنبه 29 مهر 1389, 08:42 صبح
karaji333 (http://www.barnamenevis.org/forum/member.php?u=53563) عزیز دمت گرم زحمت کشیدی ولی یه سئوال دارم . فقط برای کنجکاوی
همه تلاش برنامه نویسان برای حذف postback های زاید و هندل کردن رویدادها سمت کلاینته اون وقت آیا این روش درسته که کاری رو که می شه با یه تابع جاوا اسکریپت ساده انجام داد سمت سرور ارسال بشه :

protected void Button1_Click(object sender, EventArgs e)
{
Print1.PrintControl();
}
البته دستت درد نکنه . واقعا از ته دل می گم مخلص همه بچه هایی که مثل شما زحمت می کشن و یه کار آماده رو برای بقیه می زارن هم هستم .:قلب:

Himalaya
پنج شنبه 29 مهر 1389, 09:46 صبح
majnun (http://barnamenevis.org/forum/member.php?u=116815) جان سلام. در مورد قست اول آره. نویسنده این پلاگین گفته با ie8 , ff3.6 تست شده. ود در مورد بقیه چیزی نگفته.
تو ie8 مثل اینکه با حالت printMode=iframe مشکل داره. اونو رو popup بزارید مشکل حل میشه
در مورد سوم هم کامپوننت colorpiker آقای موسوی بیشترین کمک رو به من کرد. اونو حتما ببینید. ضمن اینکه چشم. ولی یه کم صبر کنید :چشمک:

دوست خوبم aserfg (http://barnamenevis.org/forum/member.php?u=46835) در مورد سوال شما باید بگم درسته میشد با یه کد کلاینت ساید درستش کرد ولی >>> اگه دقت کنید این کنترل رو طوری نوشتم که فقط موقع زدن دکمه پرینت این کنترل تو صفحه render میشه واگه بعد از پرینت ،یه المان دیگه باعث postback صفحه بشه این کنترل تو صفحه رندر نمیشه. تو حالت کلایند ساید فایلهای جاوا باید همیشه تو صفحه حاضر باشن . چون ممکنه کاربر هر لحظه دکمه پرینت رو بزنه ولی تو این حالت فایلهای جاوا فقط زمانی تو صفحه قرار میگیرن که کاربر دکمه پرینت رو بزنه و بعد از پرینت در صورت پست بک بعدی توسط یه المان دیگه از تو سورس صفحه حذف میشن

karim orooji
پنج شنبه 29 مهر 1389, 10:47 صبح
با سلام به دوست عزیز
با تشکر از کار زیبایی که انجام دادید ایول الله
یه مشکلی زمانی که دکمه پرینت رو میزنم این خطا صادر میشه
http://barnamenevis.org/forum/attachment.php?attachmentid=58729&stc=1&d=1287641241

Himalaya
پنج شنبه 29 مهر 1389, 20:52 عصر
سلام
dll قبلی رو کمی اصلاحش کردم و تو همون پست 1 جایگزین کردم. studentCart همون قبلیه هستش.اگه قبلا اونو دانلود کردید فقط printControl رو دانلود کنید و dll جدید رو تو پروژه جایگزین کنید. الان تو هر 2 تا حالت پرینت ((popup , iframe مشکلی نداره.
با مرورگرهای زیر هم خودم تست کردم که مطمئن بشم.
ff3.5 -- Safari4 -- Avant11 -- Chrome3 -- Netscape Navigator 9 -- ie8
تو ie7 فقط حالت popup
جناب karim orooj ، وقتی که شما پرینت رو تو حالت iframe قرار داده باشید و از ie7 استفاده کنید ، اون مشکل به وجود میاد
PrintMode رو روی popup قرار بدید تا مشکلتون حل بشه
ضمنا حواستون باشه که اگه از حالت popup استفاده میکنید ، مرورگرتون پنجره های popup رو بلاک نکرده باشه. مثلا تو safari از پنجره edit گزینه Block popup windows نباید تیک خورده باشه. خود من 1 ساعت تو safari الاف شدم که خدا چرا این تو حالت popup پرینت نمیگیره. آخر فهمیدم از اینه. بدمسب نه پیغامی میده نه چیزی.
مشکلی بود در خدمتم. فعلا

majnun
پنج شنبه 29 مهر 1389, 23:30 عصر
دستت درد نکنه برادر ممنون مخصوصا بابت هماهنگی با Chorme :لبخند:

Himalaya
جمعه 30 مهر 1389, 01:20 صبح
:چشمک: اگه منظورت از این شکلک :لبخند: اینه که Chrome رو اشتباه نوشتم باید بگم که من درست نوشتم. :گیج:

majnun
جمعه 30 مهر 1389, 01:23 صبح
نه بابا من منظورم این بود که خوشحالم با این مرورگر هم کار میکنه

چرا منظور میگیری دوست من ؟

سورسش چی شد ؟ :لبخند:

صادق صدقی
جمعه 17 دی 1389, 02:54 صبح
سلام
کاره بزرگی انجام دادی خداییش

فقط ماله من چپ به راست پرینت نشون می ده
چرا؟

Himalaya
جمعه 17 دی 1389, 23:49 عصر
سلام
احتمالا یه تگ بیرونی داره جهت تگ مورد نظر برای پرینت رو تغییر میده که این تغییر تو صفحه اعمال میشه ولی تو پرینت نه
مثلا یه همچین چیزی


<div dir="rtl">
<div id="PrintDIV">
...
</div>
</div>

صادق صدقی
شنبه 18 دی 1389, 17:35 عصر
سلام

اطلاعاتم همه تویه یک تگ به نام BaseData هست که dir=rtl هست
تویه این تگ گرید ویوو فرم ویوو و ریپیتر دارم که همه تویه تیبل هست که بازم dir اونا rtl هست!!!!!!

اما فقط یک رپیتر درسته!!!
و گرید وو هام همه می چسبه به سمت چپ!!!
تویه برنامم درسته اما پرینت نه!!

sara_1365
چهارشنبه 15 تیر 1390, 11:05 صبح
سلام دوست عزیز
چیز باحالیه
دستتون درد نکنه
ولی چه طوری میشه ابعاد چاپ رو تغییر داد و همچنین ابعاد پنجره پیش نمایش رو؟
ممکنه توضیح بدی؟

Himalaya
چهارشنبه 15 تیر 1390, 11:44 صبح
سلام


چه طوری میشه ابعاد پنجره پیش نمایش رو تغییر داد؟

2 تا پراپرتی PopupWidth و PopupHeight واسه همین کار هستش

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

h.alizadeh
چهارشنبه 05 مرداد 1390, 18:11 عصر
سلام،
من داخل یک تگ div ساده که بجز id خصوصیتی بهش ندادم و داخل این دیو من یک گریدیو گذاشتم که گرید ویوم استایل داره ولی موقع پرینت که میزنم خروجیم استایل بندی گریدویومو نشون نمیده و صرفا بدون هیچ استایل بندی نشون میده حتی border و width رو هم نشون نمیده و ستونهامو نزدیک بهم نشون میده و چفت در چفت نشون میده...

چطوریه میشه کاری کرد؟

Himalaya
چهارشنبه 05 مرداد 1390, 18:23 عصر
برنامه ات رو بزار اینجا

h.alizadeh
چهارشنبه 05 مرداد 1390, 22:50 عصر
<asp:PanelID="Panel1"runat="server"style="direction:rtl;"Width="100%">


<divid="paintdate">

<asp:LabelID="lblStartDate"runat="server"></asp:Label><asp:LabelID="lblEndDate"runat="server"></asp:Label>
</div><br/><br/>
<asp:GridViewID="GridView1"runat="server"
AutoGenerateColumns="False"onrowdatabound="GridView1_RowDataBound">

<Columns>

<asp:TemplateFieldHeaderText="نام كاربري"SortExpression="UserName">
<EditItemTemplate>
<asp:LabelID="Label1"runat="server"Text='<%# Eval("UserName") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:LabelID="Label1"runat="server"Text='<%# Bind("UserName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateFieldHeaderText="نوع كار"SortExpression="JobName">
<EditItemTemplate>
<asp:LabelID="Label2"runat="server"Text='<%# Eval("JobName") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:LabelID="Label2"runat="server"Text='<%# Bind("JobName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateFieldHeaderText="زمان صرف شده">
<ItemTemplate>
<asp:LabelID="lblUpTime"runat="server"Text='<%# Eval("DoneTime") %>'/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div></asp:Panel>

استایلهای گریدویو هم سی اس اس اش از طریق وب کانفیگ اعمال میشه و از طری فایلGridview.skin
<asp:GridViewrunat="server"CellPadding="4"
GridLines="None"
CssClass="mGrid"
PagerStyle-CssClass="pgr"
AlternatingRowStyle-CssClass="alt">
<SelectedRowStyleCssClass="selectedRowStyle"/>
<EmptyDataRowStyleHorizontalAlign="Center"/>

</asp:GridView> که محتواش اینه

Himalaya
پنج شنبه 06 مرداد 1390, 23:10 عصر
سلام

برنامه ات رو بزار اینجا
منظورم پروژت بود.

sara_1365
پنج شنبه 13 مرداد 1390, 22:29 عصر
سلام
من یه سوال دارم
البته اول بخاطر زحمتی که کشید یه تشکر لازمه

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

Himalaya
جمعه 14 مرداد 1390, 11:31 صبح
سلام

اگه من سایتم رو به سیستم دیگه ای انتقال بدم ایا این کنترل از کار میا فته و من دوباره باید تنطیمات رو انجام بدم یا نهنه، نباید مشکلی داشته باشه. فقط رو سیستم مقصد (تو حالت لوکال منظورمه) باید framework 3.5 نصب باشه و پروژه با vs 2010 یا 2008 اجرا بشه (چون با vs 2008 کامپایل شده)
اگه تو سیستم مقصد از IE7 استفاده میکنید، یا کنترل رو تو حالت Popup قرار دادید، پست 6 رو بخونید
اگه حل نشد، پروژه ای رو که گفتید رو بزارید اینجا تا ببینم ایراد از چیه

a_123123123123
یک شنبه 16 مرداد 1390, 22:12 عصر
دوست عزیز من از این کنتزل میخوام استفاده کنم

همه چیز رو هم همونطور که گفتی انجام میدم ولی این پیغام خطا رو میده
http://s1.picofile.com/file/7111025478/3243242234.jpg

لطفا بگو من چیکارش کنم

Himalaya
دوشنبه 17 مرداد 1390, 01:26 صبح
سلام تصویری که گذاشتی رو دیدم. والا این تصویر فقط یه فرم ورود اطلاعات هستش که 2 تا دکمه تایید و انصراف داره، همین. توش نه از خطا خبری بود و نه اثری از این کنترل

a_123123123123
دوشنبه 17 مرداد 1390, 11:26 صبح
ببخشید
اشتباه شد
اینه
http://s1.picofile.com/file/7111315478/11111111111111111111.jpg

Himalaya
دوشنبه 17 مرداد 1390, 12:10 عصر
برنامه به نرم افزار Microsoft OneNote (http://manmote.com/post/203142563) گیر داده و ارتباطی به این کامپوننت نداره. اررور داره میگه برای اینکه از این قابلیت بتونید استفاده کنید، نرم افزار Microsoft OneNote (http://manmote.com/post/203142563) (که حتما نصبش کردید) باید 1 بار اجرا بشه.