باسلام . :لبخندساده:
میخواستم طریقه ساخت Property های که ایتم دارن رو بدونم . این نوع Property ها با اسم Items در بیشتر کنترل ها تعریف میشن .
ضمیمه 133739
ممنون .
Printable View
باسلام . :لبخندساده:
میخواستم طریقه ساخت Property های که ایتم دارن رو بدونم . این نوع Property ها با اسم Items در بیشتر کنترل ها تعریف میشن .
ضمیمه 133739
ممنون .
اگر نوع Property که تعریف میکنید از ICollection ارث بری داشته باشه اون رو به این صورت نشون میده.
سلام من یک کلاس به این صورت تعریف کردم .
Public Class Car
Inherits System.Windows.Forms.Control
Public Property Items As List(Of Item)
Get
End Get
Set(value As List(Of Item))
End Set
End Property
Public Class Item
Public Property Name As String
Public Property Color As Color
End Class
End Class
الان مشکلم با ذخیره و بازیابی ایتم هاست .
چه مشکلی داری؟
البته درستش اینه که اینطوری بنویسی :
Public Class Car Inherits System.Windows.Forms.Control
Private _Items As List(Of Item) = New List(Of Item)
Public Property Items As List(Of Item)
Get
Return _Items
End Get
Set(value As List(Of Item))
_Items = value
End Set
End Property
Public Class Item
Public Property Name As String
Public Property Color As Color
End Class
End Class
Error ی که میده چیه!؟
سلام . این Error ی هست که موقع اضافه کردن کنترل به فرم نشون میده .
ضمیمه 133845
کسی دلیل این خطا رو نمیدونه ؟
PublicClassItem رو به یک کلاس جداگانه انتقال بده ببین درست میشه. حدثی نمیشه گفت اگر سورست کوچیکه بزارش اینجا بررسی کنیم.
سلام به همه.
کلاسی که بعنوان Type کالکشن تعیین شده باید بصورت ساده به کالکشن ارائه بشه تا در دیزانر قابل تجزیه و تبدیل باشه و همچنین باید از اتریبیوت <Serializable()> برای کلاس استفاده بشه.
ضمیمه 154219
این هم خصوصیت که باید براش چند تا اتریبیوت استفاده کنید از جمله Editor البته اگه سفارشی باشه و DesignerSerializationVisibility(DesignerSerializat ionVisibility.Visible):
ضمیمه 154220
سلام مجدد.
برای زمانی که یک دیکشنری داریم که مقادیر باید به اون اضافه بشه مثل تصویر دوم از پست 11، در ویرایشگر سفارشی حتما باید از TypeDescryptor برای ذخیر مقادیر دیکشنری استفاده بشه.
Protected RegistryDatasValue As New Dictionary(Of Integer, RegistryDataItem)
<ProviderType(ProvideTypes.RegistryData)>
<Browsable(True), RefreshProperties(RefreshProperties.All)>
<Editor(GetType(StringTableCollectionEditor), GetType(Drawing.Design.UITypeEditor))>
<DesignerSerializationVisibility(DesignerSerializa tionVisibility.Visible)>
Public Property RegistryDatas() As Dictionary(Of Integer, RegistryDataItem)
Get
Return RegistryDatasValue
End Get
Set(ByVal value As Dictionary(Of Integer, RegistryDataItem))
RegistryDatasValue = value
End Set
End Property
متود ایجاد شده برای این کار که باید در ویرایشگر خصوصیت و بعد از Ok کردن پنجره یا بستن لیست کشویی خصوصیت اعمال بشه:
Private Sub SetPropertyValue(Instance As Object, PropertyName As String, Value As Object)
Dim StringsDescryptor As PropertyDescriptor = TypeDescriptor.
GetProperties(Instance)(PropertyName)
StringsDescryptor.SetValue(Instance, Value)
End Sub
سلام جدید
من می خوام خصوصیات یک کلاس رو بر اساس نام داشته باشم، شرایط این درخواست به این صورت هست که نام خصوصیت از کاربر گرفته می شه پس بزرگ و کوچکی کاراکترهای نام خصوصیات رو کاربر تعیین می کنه و متود GetProperty نام خصوصیت رو دقیق می خواد....
آیا روشی غیر از جستجو در حصوصیات برای آسان کردن این دستور هست یا خیر؟
''' <summary>
'''
''' </summary>
''' <param name="Porject"></param>
''' <param name="Name">OptionName</param>
''' <param name="Value">OptionValue</param>
''' <remarks></remarks>
Function SetPropertyValue(ByRef Porject As ProjectItem, Name As String, Value As String) As Boolean
Console.WriteLine("{0} : {1}", Name, Name.Length)
Dim pI As PropertyInfo = GetType(ProjectItem).GetProperty(Name)
Console.WriteLine(pI.Name)
If pI Is Nothing OrElse Value.Length = 0 Then Return False
pI.SetValue(Project, Value, New Object() {})
Return True
End Function
من از این روش استفاده کردم:
Function CreateQuery(Properties As Dictionary(Of String, String)) As String
Dim Value As String = ""
Dim Query As String = "SELECT * FROM AppProjects WHERE"
Dim x As Integer = 0
For Each p As PropertyInfo In GetType(ProjectItem).GetProperties()
For Each [Property] As KeyValuePair(Of String, String) In Properties
If p.Name.ToLower = [Property].Key.ToLower Then
Value = [Property].Value
GoTo AddToQuery
End If
Next
Continue For
AddToQuery: If Value.Length > 0 Then
If x > 0 Then
Query += " AND"
End If
Query += String.Format(" {0} LIKE N'%{1}%'", p.Name, Value)
x += 1
End If
Next
If x = 0 Then Return ""
Return Query
End Function
یک مورد دیگه هم هست:
من می خوام خصوصیات بر اساس ترتیبی که خودم تعیین می کنم چاپ بشن....
Sub WriteProjectFields(p As ProjectsDataset.AppProjectsRow)
'Get Item-Name Max-Length....
Dim MaxLen As Integer = 0
Dim Value As Object
Dim PInfo As System.Reflection.PropertyInfo
For Each pI As PropertyInfo In GetType(ProjectItem).GetProperties()
If pI.Name.ToLower = "id" Then Continue For
PInfo = GetType(ProjectsDataset.AppProjectsRow).GetPropert y(pI.Name)
Value = PInfo.GetValue(p, New Object() {})
If IsDBNull(Value) = False AndAlso String.IsNullOrEmpty(Value) = False Then
If pI.Name.Length > MaxLen Then MaxLen = pI.Name.Length
End If
Next
If MaxLen = 0 Then
Console.ForegroundColor = ConsoleColor.DarkCyan
Console.WriteLine("{0} Project has not any Information.", vbTab)
Exit Sub
End If
'-----------------------
For Each pI As PropertyInfo In GetType(ProjectItem).GetProperties()
If pI.Name.ToLower = "id" Then Continue For
PInfo = GetType(ProjectsDataset.AppProjectsRow).GetPropert y(pI.Name)
Value = PInfo.GetValue(p, New Object() {})
If IsDBNull(Value) = 0 AndAlso String.IsNullOrEmpty(Value) = False Then
WriteField(pI.Name, Value, MaxLen + 1)
End If
Next
End Sub
من با این روش مرتب سازی دلخواهم رو روی خصوصیات اعمال کردم
ضمیمه 156228
یک آرایه متشکل از نام خصوصیات:
Public ReadOnly Property SortedFieldNames() As String()
Get
Dim Expr As String() =
{"ID", "Title", "Category", "ProjectType", "Language",
"StartDate", "ComputerName", "Solution", "Documents",
"Fonts", "DatabaseName", "DatabaseType", "DatabaseProject",
"Package", "Password", "Details", "EndDate"}
Return Expr
End Get
End Property
استفاده:
For Each Field As String In SortedFieldNames
If Field.ToLower = "id" Then Continue For
PInfo = GetType(ProjectsDataset.AppProjectsRow).GetPropert y(Field)
Value = PInfo.GetValue(p, New Object() {})
If IsDBNull(Value) = 0 OrElse String.IsNullOrEmpty(Value) = False Then
WriteField(Field, Value, MaxLen + 1)
End If
Next