نمایش نتایج 1 تا 3 از 3

نام تاپیک: ایجاد خصوصیت Collection برای Component سفارشی

  1. #1
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,647

    ایجاد خصوصیت Collection برای Component سفارشی

    با سلام.

    من در ساخت ایجاد Collection برای اشیاء سفارشی دانش کافی ندارم و زمانی که در دیزاین مقادیر خصوصیت تغییر می کنه ثبت می شه اما زمانی که قراره اون مقادیر دوباره استفاده بشه دیزاینر خطا بر می گردونه:

    خصوصیتی که برای شیء سفارشی ساختم اینه:


    Private VariablesValue As New List(Of VariableItem)
    <DesignerSerializationVisibility(DesignerSerializa tionVisibility.Visible)> _
    Public Property Variables() As List(Of VariableItem)
    Get
    Return VariablesValue
    End Get
    Set(value As List(Of VariableItem))
    VariablesValue = value
    End Set
    End Property



    کلاس آیتم های لیست هم این هست:

    Imports System.ComponentModel
    <Serializable()> _
    Public Class VariableItem
    Sub New()
    MyBase.New()
    Me.NameValue = MyBase.MemberwiseClone.Name
    End Sub
    Sub New(Item As VariableItem)
    MyBase.New()
    If String.IsNullOrEmpty(Item.Name) Then
    Me.NameValue = MyBase.MemberwiseClone.Name
    Else
    Me.NameValue = Item.Name
    End If
    Me.ValueValue = Item.Value
    End Sub
    Sub New(Name As String, Value As String)
    MyBase.New()
    If String.IsNullOrEmpty(Name) Then
    Me.NameValue = MyBase.MemberwiseClone.Name
    Else
    Me.NameValue = Name
    End If
    Me.NameValue = Name
    Me.ValueValue = Value
    End Sub
    Private NameValue As String
    <DesignerSerializationVisibility(DesignerSerializa tionVisibility.Visible)> _
    <ParenthesizePropertyName(True)> _
    Public Property Name() As String
    Get
    Return NameValue
    End Get
    Set(ByVal value As String)
    NameValue = value
    End Set
    End Property
    Private ValueValue As String
    <DesignerSerializationVisibility(DesignerSerializa tionVisibility.Visible)> _
    Public Property Value() As String
    Get
    Return ValueValue
    End Get
    Set(ByVal value As String)
    ValueValue = value
    End Set
    End Property


    End Class


    و اما خطا:

    Annotation 2024-04-07 202500.png


    Instances of this error (1)
    1.
    at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast)
    at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
    at System.Reflection.RtFieldInfo.UnsafeSetValue(Objec t obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture)
    at System.Runtime.Serialization.FormatterServices.Ser ializationSetValue(MemberInfo fi, Object target, Object value)
    at System.Runtime.Serialization.ObjectManager.Complet eObject(ObjectHolder holder, Boolean bObjectFullyComplete)
    at System.Runtime.Serialization.ObjectManager.DoNewly RegisteredObjectFixups(ObjectHolder holder)
    at System.Runtime.Serialization.ObjectManager.Registe rObject(Object obj, Int64 objectID, SerializationInfo info, Int64 idOfContainingObj, MemberInfo member, Int32[] arrayIndex)
    at System.Runtime.Serialization.Formatters.Binary.Obj ectReader.RegisterObject(Object obj, ParseRecord pr, ParseRecord objectPr, Boolean bIsString)
    at System.Runtime.Serialization.Formatters.Binary.Obj ectReader.ParseObjectEnd(ParseRecord pr)
    at System.Runtime.Serialization.Formatters.Binary.Obj ectReader.Parse(ParseRecord pr)
    at System.Runtime.Serialization.Formatters.Binary.__B inaryParser.Run()
    at System.Runtime.Serialization.Formatters.Binary.Obj ectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
    at System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
    at System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter.Deserialize(Stream serializationStream)
    at System.Resources.ResXDataNode.GenerateObjectFromDa taNodeInfo(DataNodeInfo dataNodeInfo, ITypeResolutionService typeResolver)
    at System.Resources.ResXDataNode.GetValue(ITypeResolu tionService typeResolver)
    at System.Resources.ResXResourceReader.ParseDataNode( XmlTextReader reader, Boolean isMetaData)
    at System.Resources.ResXResourceReader.ParseXml(XmlTe xtReader reader)


    منتظر راهنمایی های سبزتان هستیم ...
    با تشکر.

  2. #2
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,647

    نقل قول: ایجاد خصوصیت Collection برای Component سفارشی

    من از کلاس سفارشی هم برای این Collection استفاده کردم ولی در این مورد حتی اجازه اضافه کردن آیتم به خصوصیت هم نمی دهد:


    Imports System.ComponentModel


    <Serializable(), TypeConverter(GetType(VariableCollectionConverter) )> _
    Public Class VariableCollection
    Inherits List(Of VariableItem)


    Overloads Sub Add(Name As String, Value As String)
    MyBase.Add(New VariableItem(Name, Value))
    End Sub
    Overloads Sub Add(Item As VariableItem)
    MyBase.Add(Item)
    End Sub


    End Class






    Imports System.Reflection
    Imports System.ComponentModel
    Imports System.ComponentModel.Design.Serialization
    Imports System.Collections.Generic
    Public Class VariableCollectionConverter
    Inherits TypeConverter
    Public Overrides Function ConvertFrom(context As System.ComponentModel.ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object) As Object
    If TypeOf (value) Is String Then
    Dim Coll As New VariableCollection
    Dim Expr As String = value
    Dim Items As String() = Expr.Split("/")
    Dim NV As String() = {}
    Dim v As VariableItem
    For Each Item As String In Items
    NV = Item.Split(":")
    v = New VariableItem(NV(0), NV(1))
    Coll.Add(v)
    Next
    Return Coll

    End If
    Return MyBase.ConvertFrom(context, culture, value)
    End Function
    Public Overrides Function ConvertTo(context As System.ComponentModel.ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object, destinationType As System.Type) As Object
    If destinationType Is GetType(String) Then
    Dim Expr As String = ""
    With DirectCast(value, VariableCollection)
    For i = 0 To .Count - 1
    Expr += String.Format("{0}:{1}/", .Item(i).Name, .Item(i).Value)
    Next
    End With
    If Expr.Length = 0 Then Return Expr
    Return Expr.Remove(Expr.Length - 1, 1)
    ElseIf destinationType Is GetType(InstanceDescriptor) Then
    Dim ci As ConstructorInfo = GetType(VariableCollection).GetConstructor(New Type() {GetType(List(Of VariableItem))})
    Dim t As VariableCollection = CType(value, VariableCollection)
    Return New InstanceDescriptor(ci, t.ToArray)
    End If
    Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function
    Public Overrides Function CanConvertTo(context As System.ComponentModel.ITypeDescriptorContext, destinationType As System.Type) As Boolean
    If destinationType Is GetType(String) Or destinationType Is GetType(InstanceDescriptor) Then
    Return True
    End If
    Return MyBase.CanConvertTo(context, destinationType)
    End Function


    End Class

  3. #3
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    1,647

    نقل قول: ایجاد خصوصیت Collection برای Component سفارشی

    جواب رو پیدا کردم :
    فعلا که خطای دیزاین برنمی گرده

    Annotation 2024-04-07 213206.png

    باید مقدار DesignerSerialzationVisiblity برابر با Content می شد....


    <DesignerSerializationVisibility(DesignerSerializa tionVisibility.Content)> _

    https://barnamenevis.org/showthread....l=1#post676850

    البته هنوز نمی شه برای این خصوصیت کلاس سفارشی که یک Collection سفارشی باشه مثل این کلاس استفاده کرد: !!!!


    Imports System.ComponentModel


    <Serializable()> _
    Public Class VariableCollection
    Inherits Collections.ObjectModel.Collection(Of VariableItem)
    Public Sub New()
    MyBase.New()
    End Sub
    Public Sub New(list As Collections.Generic.List(Of VariableItem))
    MyBase.New(list)
    End Sub


    Public Overloads Sub Add(Name As String, Value As String)
    MyBase.Add(New VariableItem(Name, Value))
    End Sub
    Public Overloads Sub Add(Item As VariableItem)
    MyBase.Add(Item)
    End Sub


    Default Public Overloads Property Item(Name As String) As String
    Get
    For Each Var As VariableItem In MyBase.Items
    If Var.Name.Equals(Name, StringComparison.OrdinalIgnoreCase) Then
    Return Var.Value
    End If
    Next
    Return String.Empty
    End Get
    Set(value As String)
    For Each Var As VariableItem In MyBase.Items
    If Var.Name.Equals(Name, StringComparison.OrdinalIgnoreCase) Then
    Var.Value = value
    End If
    Next
    End Set
    End Property




    End Class




    فکر کنم باید براش یک Editor سفارشی ایجاد کرد.
    آخرین ویرایش به وسیله ROSTAM2 : یک شنبه 19 فروردین 1403 در 22:22 عصر

تاپیک های مشابه

  1. سوال در مورد generic collection ,nongeneric collection
    نوشته شده توسط parrto در بخش C#‎‎
    پاسخ: 0
    آخرین پست: شنبه 13 آذر 1389, 00:24 صبح
  2. ارتباط بین Collection و گزارش
    نوشته شده توسط Bisavad_Moshtagh در بخش ابزارهای گزارش سازی
    پاسخ: 2
    آخرین پست: یک شنبه 10 خرداد 1388, 12:34 عصر
  3. سوال: مشکل با Collection ها
    نوشته شده توسط rooshan2008 در بخش VB.NET
    پاسخ: 3
    آخرین پست: دوشنبه 21 بهمن 1387, 00:15 صبح
  4. سوال: راجع به collection
    نوشته شده توسط Javaprogram در بخش Java SE : نگارش استاندارد جاوا
    پاسخ: 0
    آخرین پست: سه شنبه 19 آذر 1387, 16:33 عصر
  5. استفاده از متغیرCollection در ساخت Component
    نوشته شده توسط ali2914 در بخش VB.NET
    پاسخ: 0
    آخرین پست: جمعه 16 دی 1384, 11:28 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •