PDA

View Full Version : استفاده از Page.Header درون یک تابع در Class1.vb



shahab_ksh
دوشنبه 12 آذر 1386, 20:34 عصر
چطوری میشه این تابع رو در فایل Class1.vb قرار داد و از اون در تمام صفحات استفاده کرد




Sub He()
Page.Header.InnerText = "s"
EndSub

mahdi_farhani
دوشنبه 12 آذر 1386, 21:48 عصر
منظورتو درست متوجه نشدم .
ولی شما میتونید تابعی که نوشتید را Public کنید ، بعد در هر صفحه که می خواهیی ازش استفاده کنی یه نمونه ازش بسازی و اونو صدا بزنی
و یا اگر میخواهی که در هر صفحه نمونه سازی نکنی میتونی اونو به صورت Share تعریف کنی و در هر صفحه نام کلاس و نام تابع را صدا بزنی

shahab_ksh
دوشنبه 12 آذر 1386, 21:53 عصر
نه مشکل این نیست مشکل استفاده از Page.Header.InnerText در class1.vb هستش
چون مثل اینکه Page.Header برای class1 ناشناخته هستش

حتی بصورت زیر در آوردم اما باز هم


Public Shared Sub He()
Dim a As New Page
a.Header.InnerText = "s"
End Sub


اما موقع کامپایل فایل class1.vb پیغام معروف
Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 34: Public Shared Sub He()Line 35: Dim a As New PageLine 36: a.Header.InnerText = "s"Line 37: End SubLine 38:
Source File: F:\PROJECT\Sql Platfrom\App_Code\Class1.vb Line: 36

mahdi_farhani
دوشنبه 12 آذر 1386, 21:58 عصر
خوب به کلاست بگو از System.web.Ui.Page ارث بری کنه

Behrouz_Rad
دوشنبه 12 آذر 1386, 22:54 عصر
Public NotInheritable Class clsTest
Public Shared Sub doWork()
Dim obj_Page As Page = TryCast(HttpContext.Current.CurrentHandler, Page)
If (obj_Page IsNot Nothing) Then
obj_Page.Header.InnerText = "be hamin sadegi!"
End If
End Sub
End Class

mahdi_farhani
سه شنبه 13 آذر 1386, 03:06 صبح
آقا بهروز میشه یه توضیحی در مورد کد فوق بدید ،،،،،،

shahab_ksh
سه شنبه 13 آذر 1386, 10:18 صبح
اقا بهروز در خط


obj_Page.Header.InnerHtml = "be hamin sadegi!"



باز هم ایراد Object reference not set to an instance of an object.
رو گرفت



Line 17: Dim obj_Page As Page = TryCast(HttpContext.Current.CurrentHandler, Page)Line 18: If (obj_Page IsNot Nothing) ThenLine 19: obj_Page.Header.InnerHtml = "be hamin sadegi!"Line 20: End IfLine 21: End Sub

Behrouz_Rad
سه شنبه 13 آذر 1386, 11:13 صبح
آقا بهروز میشه یه توضیحی در مورد کد فوق بدید ،،،،،،

هر کجاش رو متوجه نشدی بگو توضیح بدم.

اقا بهروز در خط


obj_Page.Header.InnerHtml = "be hamin sadegi!"



باز هم ایراد Object reference not set to an instance of an object.
رو گرفت



Line 17: Dim obj_Page As Page = TryCast(HttpContext.Current.CurrentHandler, Page)Line 18: If (obj_Page IsNot Nothing) ThenLine 19: obj_Page.Header.InnerHtml = "be hamin sadegi!"Line 20: End IfLine 21: End Sub

به احتمال زیاد "runat="server رو از تگ head حذف کردی! من تست کردم؛ مشکلی نداره.
البته این عجیبه که می خوای به تگ head یک عبارت رو نسبت بدی... معمولا انتساب متن به title مرسوم هست!

موفق باشید.

mahdi_farhani
سه شنبه 13 آذر 1386, 14:54 عصر
NotInheritable , tryCast
traycast فکر کنم برای تغییر نوع باشه اگر اشتباه نکم
. اصلاً عملکرد این کد چی هست رو می خواهم بدونم و همچنین معادلش تو C#

shahab_ksh
سه شنبه 13 آذر 1386, 16:03 عصر
مرسی



البته این عجیبه که می خوای به تگ head یک عبارت رو نسبت بدی... معمولا انتساب متن به title مرسوم هست!

آقا بهروز این کد رو نمونه گذاشتم در نظر بگیرید شما چند تا کنترل با ID همنام در چند صفحه مختلف دارید که که کارهایی مثل این تابع رو انجام میده



Sub EmpData()
Label1.Text = ""
Massage.Text = "ok"
Textbox1.Text = "123"
EndSub


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

Behrouz_Rad
سه شنبه 13 آذر 1386, 21:57 عصر
NotInheritable , tryCast
traycast فکر کنم برای تغییر نوع باشه اگر اشتباه نکم

اینجا وارد بحث های مفهومی دات نت میشیم. زیاد بحث رو پیچیده نمی کنم و سعی می کنم به زبان ساده توضیح بدم.
در Visual Basic 6.0 زمانی که قصد داشتی تعدادی متد و روال های عمومی تعریف کنی که در تمام پروژه استفاده میشن، اونها رو در یک Module تعریف می کردی.
VB.NET ضمن حمایت از روش قدیمی Module، برای یکپارچگی با زبان های دیگه ی مبتنی بر پلت فرم دات نت و رعایت اصل جابجایی برنامه با رعایت استاندارد دات نت، نوع جدیدی از کلاس ها رو با عنوان کلاس های NotInheritable معرفی کرده که کلاس هایی که در نقش Utility ظاهر میشن، بدون نیاز به new کردن ازشون بشه به اعضای اونها دسترسی داشت.
چون کلاس های NotInheritable، غیر قابل به ارث برده شدن هستند و اعضای Shared نیز نمی تونن از Instance یک کلاس ایجاد بشن، پس بهترین کار این هست که اعضای یک کلاس NotInheritable رو Shared تعریف کنیم. از این طریق در مصرف حافظه نیز صرفه جویی میشه.
در #C، کلاس های sealed معادل NotInheritable و اعضای static معادل Shared در VB.NET هستند.

و اما در مورد TryCast و کاربرد اون:
قبلا هم در این مورد در چند تاپیک توضیح دادم.
در دات نت Casting های مختلفی وجود داره که شناخت دقیق، صحیح و استفاده ی بجا از اونها، تاثیر مستقیمی در Performance خواهد داشت.

انواع Casting های تبدیل نوعی به نوع دیگه در VB.NET شامل:
1) CType
DirectCast (2
TryCast (3

CType برای تبدیل هر نوع داده ای به همدیگه استفاده میشه و تمام تلاشش رو انجام میده تا نوع ها رو به هم تبدیل کنه. مثلا برای تبدیل Int32 به Double. در CType تفاوت در نوع هدف تبدیلی و اون چیزی که قرار هست بهش تبدیل بشه تا اونجایی که مجاز باشه وجود نداره.

DirectCast برای زمانی هست که نوع داده برای شما واضح هست. مثلا می دونید که کنترل شما حتما Button هست و لاغیر! هر چند که می تونید در این حالت از CType هم استفاده کنید اما DirectCast بهینه تر و دارای سرعت بالاتر هست.

TryCast هنگامی استفاده میشه که به انجام موفقیت آمیز عملیات تبدیل اطمینان ندارید! مثلا ممکنه کنترلی که به اون ارجاء پیدا کردید از نوع Button باشه اما قصد دارید تا اون رو به CheckBox تبدیل کنید. در این حالت استفاده از CType یا DirectCast باعث بروز خطای InvalidCastException میشه اما TryCast در صورتی که موفق به تبدیل نوعی به نوع دیگه نشه، مقدار Nothing (در VB.NET) و null (در #C) رو بر می گردونه که می تونید با شرط If این مورد رو چک کنید.

در #C معادلی برای DirectCast وجود نداره اما برای TryCast میشه از کلمه ی کلیدی as استفاده کرد:


Button obj_Btn = e.Row.FindControl("myButton") as Button;
if (obj_Btn != null)
{
//har kari doost dari ba Button bokon!
}



. اصلاً عملکرد این کد چی هست رو می خواهم بدونم

تنها قسمت مهم اون کد، عبارت HttpContext.Current.CurrentHandler هست.
CurrentHandler به Context ای اشاره می کنه که در حال استفاده از کلاس هست. در اینجا ما می دونیم که یک Page قرار هست از این کلاس استفاده کنه. دلیل استفاده ی من از TryCast هم همین هست که در جای دیگه، مثلا یک وب سرویس استفاده از این کلاس معنا نداره و باعث بروز خطا میشه!


آقا بهروز این کد رو نمونه گذاشتم در نظر بگیرید شما چند تا کنترل با ID همنام در چند صفحه مختلف دارید که که کارهایی مثل این تابع رو انجام میده


Sub EmpData()
Label1.Text = ""
Massage.Text = "ok"
Textbox1.Text = "123"
EndSub

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

پروسیجر فوق رو می تونی به شکل یک تابع با 3 ورودی از نوع کنترل ها تعریف کنی و در هر صفحه ای که دوست داشتی فراخوانیش کنی:


Public Sub doWork(ByVal obj_Label As Label, ByVal obj_Button As Button, ByVal obj_TextBox As TextBox)
obj_Label.Text = "Test Label"
obj_Button.Text = "Test Button"
obj_TextBox.Text = "Test TextBox"
End Sub

موفق باشید.

mahdi_farhani
سه شنبه 13 آذر 1386, 23:23 عصر
آقا بهروز خیلی ممنون خیلی کامل و جامع بود ، ولی آقا بهروز من تو یکی از کلاسهام احتیاج داشتم بدون اینکه New بشه از اون استفاده کن ، دقیقا می خواستم داخل گرید و یک TemplateItem یک تابع برای جدا کردن ارقام با کاما ازش استفاده کنم و فقط اونو Public و Static تعریف کردم مشکلم حل شد ، پس فرق این با NotInheritable چیه ، اینجا مفهوم ارث بری جلو میاد . اینو من درست متوجه نشدم .
و آیا این مشکل دوستمون با ارث بری کردن از خوده صفحه حل نمیشود ؟؟؟

Behrouz_Rad
چهارشنبه 14 آذر 1386, 10:42 صبح
NotInheritable یعنی کسی نتونه از کلاس به ارث ببره و متدهای کلاس رو Override کنه.
حالا زیاد مهم نیست... میشد که اون کلاس رو با حالت new کردن هم پیاده سازی کرد.
این به میزان تسلط شما بر مفاهیم دات نت و شی گرایی و آینده نگری! و چند فاکتور دیگه بستگی داره.
در این حالت و با شرایط موجود، بهتر این هست که اون کلاس رو به شکل یک Utility پیاده سازی کنی که شروط پیاده سازی یک کلاس به شکل یک Utility رو عرض کردم.

ا این مشکل دوستمون با ارث بری کردن از خوده صفحه حل نمیشود ؟؟؟
میشه اما کار رو پیچیده تر می کنی!
باید روال onLoad رو Override کنه و صفحش رو مجبور کنه که از کلاس مذبور ارث ببره...

موفق باشید.