PDA

View Full Version : استفاده از class در asp.net



reza_engineer
دوشنبه 04 اردیبهشت 1391, 18:37 عصر
با سلام خدمت اساتید محترم و دوستان عزیز
من یک سوال برام پیش اومده که امیدوارم کسانی که تسلط دارن پاسخ بدن و بنده رو راهنمایی کنن

من یک توی یک پروژه تحت وب برای نگهداری اطلاعات کلاس های خاص آنها رو ایجاد کردم که در پایان ثبت خود کلاس آنها رو در دیتابیس ذخیره کنه

فرض کنی اسم کلاس ما Project هستش

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

Private Shared Pr As Project

سپس یک قسمت از صفحه یک نمونه جدید از کلاس ایجاد میکنم

Pr= New Project

و در بخش های پایین تر مقدار دهی می کنم

Pr.Title="Car"

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

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

میشه راهنمایی کنید که آیا نمونه ایجاد شده کلاس ها مشابه سیشن کار میکنند که برای هر کاربر مستقل ایجاد میشن یا اینکه نمونه فقط یکی است

ahmad156
دوشنبه 04 اردیبهشت 1391, 18:44 عصر
دوست عزیز اگر از گزینه Shared استفاده کنین به ازای تمام افراد که صفحه شما رو میبینن فقط یه دونه ایجاد میشه وبین همه اونها مشترک هست

reza_engineer
دوشنبه 04 اردیبهشت 1391, 20:21 عصر
خوب shared رو بردارم از قسمت اعلان صفحه اونوقت فقط تو روالی که ازش NEW ایجاد می کنم نمونه ایجاد شده از کلاس در دسترس هست و روال بعدی که بخوام به نمونه ایجاد شده از کلاس مراجعه کنم خطای وجود نداشتن رو میده
به نظرت باید Public بدون Shared تعریفش کنم در قسمت اعلان؟

reza_engineer
سه شنبه 05 اردیبهشت 1391, 00:41 صبح
دوستان لطفا کمک کنید؟

من مسئله رو طور دیگه بیان میکنم

این کد شبیه کد منه

1: Partial Class Defualt
2: Inherits System.Web.UI.Page
3:
4: Private Pr as Project
5:
6: Protected Sub Button1_Click(Byval sender As Object, Byval e As System.EventArgs) Handles Button1.Click
7:
8: Pr=New Project
9: Pr.Code=100
10: Response.Write(Pr.Code)
11:
12: End Sub
13:
14: Protected Sub Button2.Click(Byval sender As Object, Byval e As System.EventArgs) Handles Button2.Click
15:
16: Response.Write(Pr.Code)
17:
18: End Sub
19:
20: End Class

دقت بفرمایید من در قسمت اعلان یک شی رو از کلاس پروژه ایجاد کردم

در روال کلیک دکمه اول نمونه جدید رو از کلاس پروژه ایجاد می کنم و مقدار کد رو بهش میدم و چاپ می کنم هیچ مشکلی نداره

اما در روال کلیک دکمه 2 در خط 16 که به شی ایجاد شی مراجعه میکنم که کد رو نشون بده خطای زیر رو میزنه

object reference not set to an instance of an object

reza_engineer
سه شنبه 05 اردیبهشت 1391, 00:45 صبح
آیا بین روال های داخل یک صفحه با اینکه من اعلان شی رو در قسمت بالای صفحه اعلام کردم و ایجاد نمونه جدید رو داخل یک روال می بایست برای انتقال داده های آن بین روال های همون صفحه از Session استفاده کنم؟

ahmad156
سه شنبه 05 اردیبهشت 1391, 09:22 صبح
دوستان لطفا کمک کنید؟

من مسئله رو طور دیگه بیان میکنم

این کد شبیه کد منه

1: Partial Class Defualt
2: Inherits System.Web.UI.Page
3:
4: Private Pr as Project
5:
6: Protected Sub Button1_Click(Byval sender As Object, Byval e As System.EventArgs) Handles Button1.Click
7:
8: Pr=New Project
9: Pr.Code=100
10: Response.Write(Pr.Code)
11:
12: End Sub
13:
14: Protected Sub Button2.Click(Byval sender As Object, Byval e As System.EventArgs) Handles Button2.Click
15:
16: Response.Write(Pr.Code)
17:
18: End Sub
19:
20: End Class

دقت بفرمایید من در قسمت اعلان یک شی رو از کلاس پروژه ایجاد کردم

در روال کلیک دکمه اول نمونه جدید رو از کلاس پروژه ایجاد می کنم و مقدار کد رو بهش میدم و چاپ می کنم هیچ مشکلی نداره

اما در روال کلیک دکمه 2 در خط 16 که به شی ایجاد شی مراجعه میکنم که کد رو نشون بده خطای زیر رو میزنه

object reference not set to an instance of an object
دوست عزیز شما دارین از 2 تا Scope جدا استفاده میکنین.یه امر واضح هست که وقتی شما یه تعریف محلی (یا همون New )دارین فقط تو همون Scope قابل دسترسی هست

d_derakhshani
سه شنبه 05 اردیبهشت 1391, 09:34 صبح
این به این دلیل که بعد رندر صفحه تمامی منابع اشغال شده توسط اون از جمله متغیر های آزاد میشن و در مراجعات بعدی مقدار ندارند. برای اینکه این مشکل پیش نیاد باید از Viewstate و یا Session استفاده کنید. و این موضوع به کاربرد شما هم بستگی داره. اگه شی کوچیکه و برای یک صفحه هست از viewState استفاده کنید اما باید دقیقا مشخص باشه که می خواهید چی کار کنید تا مشخص بشه باید از کدوم استفاده کرد(البته راه های دیگه ای از جمله profile و cache هم موجوده)

reza_engineer
سه شنبه 05 اردیبهشت 1391, 10:03 صبح
یعنی برای روال های توی یک صفحه با اینکه من اعلان اولیه کلاس رو بالای صفحه گذاشتم و در یکی از روال ها کلاس رو ایجاد می کنم و مقدار دهی میکنم برای اینکه شی ایجاد شده از کلاس در روال بعدی در همان صفحه اطلاعاتش بمونه و ازش استفاده کنم باید در روال قبلی در viewstate ذخیره اش کنم و در روال بعدی از viewState بخونمش و از مقادیرش استفاده کنم؟

d_derakhshani
سه شنبه 05 اردیبهشت 1391, 10:13 صبح
یعنی برای روال های توی یک صفحه با اینکه من اعلان اولیه کلاس رو بالای صفحه گذاشتم و در یکی از روال ها کلاس رو ایجاد می کنم و مقدار دهی میکنم برای اینکه شی ایجاد شده از کلاس در روال بعدی در همان صفحه اطلاعاتش بمونه و ازش استفاده کنم باید در روال قبلی در viewstate ذخیره اش کنم و در روال بعدی از viewState بخونمش و از مقادیرش استفاده کنم؟
بله همین طوره

reza_engineer
سه شنبه 05 اردیبهشت 1391, 10:33 صبح
مرسی از راهنمایی شما دوستای عزیزم
فقط یه سوال دیگه
حالا که کاربرد شی ایجاد شده از کلاس موردنظر فقط در همان صفحه هستش و شی رو باید برای حرکت بین روالها توی viewstate ذخیره کنم آیا برای هر کابری که جداگانه این صفحه رو اجرا می کنه و یک شی جدید ایجاد میشه viewstate مقادیر هر شی جدارو برای هر کاربر ذخیره می کنه و نمونه های ایجاد شده مستقل هستن؟

d_derakhshani
سه شنبه 05 اردیبهشت 1391, 10:41 صبح
مرسی از راهنمایی شما دوستای عزیزم
فقط یه سوال دیگه
حالا که کاربرد شی ایجاد شده از کلاس موردنظر فقط در همان صفحه هستش و شی رو باید برای حرکت بین روالها توی viewstate ذخیره کنم آیا برای هر کابری که جداگانه این صفحه رو اجرا می کنه و یک شی جدید ایجاد میشه viewstate مقادیر هر شی جدارو برای هر کاربر ذخیره می کنه و نمونه های ایجاد شده مستقل هستن؟

بله
فقط یادتون نره صفت Serializable رو بالای کلاستون بزارید

reza_engineer
سه شنبه 05 اردیبهشت 1391, 11:28 صبح
بله
فقط یادتون نره صفت Serializable رو بالای کلاستون بزارید

میشه بیشتر توضیح بدی ؟ این صفت برای چیه و چه جوری باید مقدار دهی یا تعریف بشه؟

d_derakhshani
سه شنبه 05 اردیبهشت 1391, 12:01 عصر
Imports System.Runtime.Serialization
<Serializable>
Public Class MyClass



using System.Runtime.Serialization;
[Serializable]
public class MyClass

reza_engineer
سه شنبه 05 اردیبهشت 1391, 12:06 عصر
مرسی فقط یه توضیح مختصر بدی که کارش چیه ؟

reza_engineer
سه شنبه 05 اردیبهشت 1391, 18:53 عصر
لطفا در مورد این Serializable توضیح بیشتر بده
من اینو به اول کلاس اضافه کردم اما وقتی که می خواد انو بریزم تو viewstate پیام زیر رو میده


Error serializing value 'CurrentProject' of type 'Project'

reza_engineer
سه شنبه 05 اردیبهشت 1391, 20:32 عصر
لطفا راهنمایی کنید خیلی ضروری نیاز دارم

d_derakhshani
سه شنبه 05 اردیبهشت 1391, 21:27 عصر
خوب این مربوط میشه به کلاس مورد نظرتون. کد کلاس تون رو بزارید. وقتی کلاسی می خواد serialize بشه باید تمام پروپرتی های درونیش نیز Serializable باشه. گویا CurrentProject اینطور نیست

reza_engineer
چهارشنبه 06 اردیبهشت 1391, 00:00 صبح
<System.Serializable()>
Public Class CurrentProject
Inherits BaseClass

Public SubProjects As New List(Of SubProject)
Public Survey As New Survey

Private DBManager As New DataManager
Private PersianDate As New Farhani.PersianDate.PerDate

Private _ProjectCode As String
Private _ContracCode As String
Private _ContractTime As Integer
Private _WeightPercent As Double
Private _RealProgressPercent As Double
Private _VirtualProgressPercent As Double
Private _StructureCode As Integer
Private _HaveStructure As Boolean
Private _HaveTimeLine As Boolean
Private _ContractorName As String
Private _HeadSupervisor1Code As Integer
Private _HeadSupervisor1Name As String
Private _HeadSupervisor2Code As Integer
Private _HeadSupervisor2Name As String
Private _Supervisor1Code As Integer
Private _Supervisor1Name As String
Private _Supervisor2Code As Integer
Private _Supervisor2Name As String
Private _Advisor1Code As Integer
Private _Advisor1Name As String
Private _Advisor2Code As Integer
Private _Advisor2Name As String
Private _StartDate As String
Private _EndDate As String
Private _WorkDelay As Integer
Private _SurveyCount As Integer
Private _Status As Integer
Private _Place As String

Public Sub New()
'MyBase.New(Code)
End Sub


Public Property ProjectCode() As String
Get
Return _ProjectCode
End Get
Set(value As String)
_ProjectCode = value
End Set
End Property

Public Property ContracCode() As String
Get
Return _ContracCode
End Get
Set(value As String)
_ContracCode = value
End Set
End Property

Public Property WeightPercent() As Double
Get
Return _WeightPercent
End Get
Set(value As Double)
_WeightPercent = value
End Set
End Property

Public Property RealProgressPercent() As Double
Get
Return _RealProgressPercent
End Get
Set(value As Double)
_RealProgressPercent = value
End Set
End Property

Public ReadOnly Property Place() As String
Get
Return _Place
End Get

End Property

Public ReadOnly Property HeadSupervisor1Name() As String
Get
Return _HeadSupervisor1Name
End Get
End Property

Public ReadOnly Property HeadSupervisor2Name() As String
Get
Return _HeadSupervisor2Name
End Get
End Property


Public ReadOnly Property Supervisor1Name() As String
Get
Return _Supervisor1Name
End Get
End Property

Public ReadOnly Property Supervisor2Name() As String
Get
Return _Supervisor2Name
End Get
End Property

Public ReadOnly Property Advisor1Name() As String
Get
Return _Advisor1Name
End Get
End Property

Public ReadOnly Property Advisor2Name() As String
Get
Return _Advisor2Name
End Get
End Property

Public ReadOnly Property ContractorName() As String
Get
Return _ContractorName
End Get
End Property

Public ReadOnly Property ContractTime() As String
Get
Return _ContractTime
End Get
End Property



Public Sub ReadData()

Dim rdr As SqlDataReader
rdr = DBManager.ExcuteReader("Select * From Survey_OfficeCurrentProjects_View Where CurrentProjectCode='" & Me.Code & "'")
rdr.Read()

MyBase.Title = rdr("CurrentProjectTitle")
MyBase.OfficeCode = rdr("OfficeCode")

_ProjectCode = rdr("ProjectCode")
_ContracCode = rdr("ContractCode")
_WeightPercent = rdr("WeightPercent")
_RealProgressPercent = rdr("RealProgressPercent")
_VirtualProgressPercent = rdr("VirtualProgressPercent")
_ContractTime = rdr("ContractTime")
_StructureCode = rdr("StructureCode")
_HaveStructure = rdr("HaveStructure")
_HaveTimeLine = rdr("HaveTimeLine")
_ContractorName = rdr("ContractorName")
_HeadSupervisor1Code = rdr("HeadSupervisor1Code")
_HeadSupervisor1Name = rdr("HeadSupervisor1Name")
_HeadSupervisor2Code = rdr("HeadSupervisor2Code")
_HeadSupervisor2Name = rdr("HeadSupervisor2Name")
_Supervisor1Code = rdr("Supervisor1Code")
_Supervisor1Name = rdr("Supervisor1Name")
_Supervisor2Code = rdr("Supervisor2Code")
_Supervisor2Name = rdr("Supervisor2Name")
_Advisor1Code = rdr("Advisor1Code")
_Advisor1Name = rdr("Advisor1Name")
_Advisor2Code = rdr("Advisor2Code")
_Advisor2Name = rdr("Advisor2Name")
_WorkDelay = rdr("WorkDelayedByDays")
_SurveyCount = rdr("SurveyCount")
_Status = rdr("Status")
_Place = rdr("City").ToString & " " & rdr("Town") & " " & rdr("Village") & " " & rdr("Address")

rdr.Close()

End Sub

Public Sub SubProjectsInitialize(Code As String)

Dim rdr As SqlDataReader
rdr = DBManager.ExcuteReader("Select SubProjectCode From SubProjects Where CurrentProjectCode='" & Code & "'")
Dim i As Integer = 0
While rdr.Read
Me.SubProjects.Add(New SubProject()) 'rdr("SubProjectCode")
Me.SubProjects.Item(i).Code = rdr("SubProjectCode")
Me.SubProjects.Item(i).StepsInitialize(rdr("SubProjectCode"))
i = i + 1
End While
rdr.Close()

End Sub

Public Sub UpdateData()
_SurveyCount = DBManager.ExcuteScalar("Select Count(*) From Survey Where CurrentProjectCode='" & MyBase.Code & "'")
End Sub

Public Function SubProjectCount() As Integer
Return DBManager.ExcuteScalar("Select Count(*) From SubProjects Where CurrentProjectCode='" & MyBase.Code & "'")
End Function

Public Function SurveyCount() As Integer
Return DBManager.ExcuteScalar("Select Count(*) From Survey Where CurrentProjectCode='" & MyBase.Code & "'")
End Function

Public Function CheckLastSurveyDate(SurveyDate As String) As Boolean
Dim LastSurveyDate, NowSurveyDate As String

NowSurveyDate = clsSurvey.SurveyFunction.PersianDateWithoutSlash(S urveyDate).Trim()
LastSurveyDate = DBManager.ExcuteScalar("Select Top 1 SurveyHijriDate From Survey Where CurrentProjectCode=" & MyBase.Code & " Order By SurveyHijriDate Desc")
If String.Compare(NowSurveyDate.Trim, LastSurveyDate.Trim) = 0 Then
Return True
Else
Return False
End If

End Function

Public Function CheckCurrentSurveyDate(SurveyDate As String) As Boolean
Dim CurrentDate, NowSurveyDate As String

NowSurveyDate = clsSurvey.SurveyFunction.PersianDateWithoutSlash(S urveyDate).Trim()
CurrentDate = clsSurvey.SurveyFunction.PersianDateWithoutSlash(P ersianDate.FullDate(PersianDate.CurrentDate))
If String.Compare(NowSurveyDate.Trim, CurrentDate.Trim) > 0 Then
Return True
Else
Return False
End If
End Function

End Class

reza_engineer
چهارشنبه 06 اردیبهشت 1391, 00:02 صبح
کد رو براتون گذاشتم حالا دقیق بگید کجا هاش باید srializable رو بزارم

reza_engineer
پنج شنبه 07 اردیبهشت 1391, 18:39 عصر
رفیق جواب ندادی؟!

d_derakhshani
پنج شنبه 07 اردیبهشت 1391, 18:56 عصر
رفیق جواب ندادی؟!
عذر می خوام من یادم میره. لطفا در اینجور مواقع برام پیام خصوصی بزارید یادآوری کنید. چون من title تاپیک رو میبینم اما یادم نمیاد که خودم بهش جواب داده بود.
حالا کدو خط خطا میده؟
BaseClass چیه؟SubProject هم همینطور.

راستی اگه از VS 2010 استفاده می کنی لازم نیست واسه پروپرتی ها متغیر عضو تعریف کنی(مثل C# که لازم نداره) فقط کافیه بنویسی:
Public Property MyProperty as Type

reza_engineer
پنج شنبه 07 اردیبهشت 1391, 20:58 عصر
این کلاس پروژه است که BaseClass به عنوان کلاس پایه که فقط code و title رو که برای تمام کلاس ها مشترکه رو پیاده می کنه
و اینکه subproject کلاس زیر پروژه اس که هر پروژه ای می تونه چند تا زیر پروژه داشته باشه و تعریفش کردم از نوع list of که در داحل برنامه New کنم و اطلاعات رو بهش بدم
خطا رو تو پست های قبلی دادم اونم اینکه برای serializing خطا میده که از viewstate استفاده کنم من فعلا از session استفاده کردم کارم جلو بره

راجع این نکته vs2010 یک مثال برام بگو

d_derakhshani
پنج شنبه 07 اردیبهشت 1391, 22:55 عصر
راجبه نکته که زیرش مثال زدم.
تمامی کلاس های دورن کلاست هم باید Serializable باشه. لیست Serializable نیست. باید یک کلاس تعریف کنی و از لیست مربوطه ارث ببری و attribute مربوط به Serializableرو بالاش بزاری و از اون استفاده کنی