|
分類:[.NET 全般]
2013/03/12(Tue) 22:36:46 編集(投稿者)
はじめて利用させていただきます。 VB初心者です。
現在Visual Basic 2010 Express と .NET Framework 2.0で Windowsアプリケーションを作成しています。 そこで利用するカスタムコントロールを作成中なのですが、 デザイナで自動生成された宣言がエラーとなり困っています。
ExpandableObjectConverterを継承した独自のConverterを作り、 Structureのプロパティが以下の状況になるまでは、実装できました。
1)デザイナ上で展開が可能 + KobetuBorder L Left L Top L Right L Bottom
2)デザイナ上での、プロパティの順番(ソート)を指定。 「Bottom,Left,Right,Top」⇒「Left,Top,Right,Bottom」
3)デザイナ上で、構造体内のプロパティに設定した値を親プロパティにカンマ区切りで表示&その逆。 + KobetuBorder False,True,False,True L Left False L Top True L Right False L Bottom True
このプロパティをデザイナ上で設定変更すると、自動生成されるコードに Me.Label1.KobetuBorder.Left = False Me.Label1.KobetuBorder.Top = True Me.Label1.KobetuBorder.Right = False Me.Label1.KobetuBorder.Bottom= True と宣言されてしまい、エラーとなってしまいます。
Point、Size、PaddingプロパティのようにNewで宣言されるようにするには、 どうすれば良いのでしょうか? 実際、以下のように宣言されることを望んでいます。 Me.Label1.KobetuBorder = New KobetuBorder(False,True,False,True)
以上です。よろしくお願い致します。
>>追記 実際のソースは↓こんな感じです。
Private _KobetuBorder As New KobetuBorder(False, False, False, False) <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ Public Property KobetuBorder() As KobetuBorder Get Return _KobetuBorder End Get Set(ByVal value As KobetuBorder) _KobetuBorder = value End Set End Property
<Serializable()> _ <TypeConverter(GetType(KobetuBorderConverter))> _ Public Structure KobetuBorder
Public Sub New(ByVal left As Boolean , ByVal top As Boolean , ByVal right As Boolean , ByVal bottom As Boolean) Me.Left = left Me.Top = top Me.Right = right Me.Bottom = bottom End Sub
Private _Left As Boolean Private _Top As Boolean Private _Right As Boolean Private _Bottom As Boolean
Public Property Left() As Boolean Get Return _Left End Get Set(ByVal value As Boolean) _Left = value End Set End Property
'----------以下同様のProperty宣言省略----------
End Structure
Public Class KobetuBorderConverter Inherits ExpandableObjectConverter
Public Overloads Overrides Function CanConvertTo( ByVal context As ITypeDescriptorContext, ByVal destinationType As Type) As Boolean
If destinationType Is GetType(KobetuBorder) Then Return True End If Return MyBase.CanConvertTo(context, destinationType) End Function
Public Overloads Overrides Function ConvertTo( ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As Type) As Object
If destinationType Is GetType(String) And TypeOf value Is KobetuBorder Then Dim kBorder As KobetuBorder = CType(value, KobetuBorder) Return kBorder.Left.ToString() & "," & kBorder.Top.ToString() & "," & kBorder.Right.ToString() & "," & kBorder.Bottom.ToString() End If Return MyBase.ConvertTo(context, culture, value, destinationType) End Function
Public Overloads Overrides Function CanConvertFrom( ByVal context As ITypeDescriptorContext, ByVal sourceType As Type) As Boolean If sourceType Is GetType(String) Then Return True End If Return MyBase.CanConvertFrom(context, sourceType) End Function
Public Overloads Overrides Function ConvertFrom(ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object If TypeOf value Is String Then Dim ss As String() = value.ToString().Split(New Char() {","c}, 4) Dim kBorder As New KobetuBorder(ss(0), ss(1), ss(2), ss(3)) Return kBorder End If Return MyBase.ConvertFrom(context, culture, value) End Function
Public Overrides Function GetCreateInstanceSupported(context As System.ComponentModel.ITypeDescriptorContext) As Boolean If context.PropertyDescriptor.PropertyType Is GetType(KobetuBorder) Then Return True End If Return MyBase.GetCreateInstanceSupported(context) End Function
Public Overrides Function CreateInstance(context As System.ComponentModel.ITypeDescriptorContext, propertyValues As System.Collections.IDictionary) As Object If context.PropertyDescriptor.PropertyType Is GetType(KobetuBorder) Then Return New KobetuBorder(propertyValues("Left"), propertyValues("Top"), propertyValues("Right"), propertyValues("Bottom")) End If Return MyBase.CreateInstance(context, propertyValues) End Function
Public Overloads Overrides Function GetProperties(context As System.ComponentModel.ITypeDescriptorContext, value As Object, attributes() As System.Attribute) As System.ComponentModel.PropertyDescriptorCollection '--------- ソート用なので省略 End Function
Public Overloads Overrides Function GetPropertiesSupported(context As System.ComponentModel.ITypeDescriptorContext) As Boolean '--------- ソート用なので省略 End Function
|