2008/05/13(Tue) 00:59:35 編集(投稿者)
<pre><pre>■No18298 (魔界の仮面弁士 さん) に返信
> ■No18297 (E+ さん) に返信
>>列挙体で指定した値をenumコンバータ属性を付けてみたのですが、
> 下記で提案されているような実装でしょうか?
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=7087&KLOG=18
その様なのですが、この後どーして良いか解りません。
>>デザイナで見ると最初の一項目だけ日本語表示し、リストを開くと
>>リスト内部には一項目しかない状態で空白を選択すると落ちてしまいます。
> 問題が発生しているコンバータの、具体的なコードを提示する事は出来ますか?
取りあえずテスト段階なので、関連記事から辿ったソースを拝借しています。
以下の様にしています。
で、フォームプロジェクトを作ってSampleをツールボックスからフォームへ貼り、
pet1というプロパティができるのでこれを見ると落ちてしまいます。
Imports System.ComponentModel
Imports System.Globalization
Imports System.Reflection
Imports System.Windows.Forms
Public Class Sample
Inherits Button
Private m_pet1 As Animal
<TypeConverter(GetType(EnumDisplayNameConverter))> _
Public Enum Animal
<EnumDisplayName("猫")> _
Cat
<EnumDisplayName("犬")> _
Dog
<EnumDisplayName("牛")> _
Cow
<EnumDisplayName("馬")> _
Hourse
End Enum
Public Property Pet1() As Animal
Get
Return Me.m_pet1
End Get
Set(ByVal value As Animal)
Me.m_pet1 = value
End Set
End Property
End Class
<AttributeUsage(AttributeTargets.All)> _
Public Class EnumDisplayNameAttribute
Inherits Attribute
Private m_name As String
Public Sub New(ByVal name As String)
Me.m_name = name
End Sub
Public ReadOnly Property Name() As String
Get
Return GetName(CultureInfo.CurrentCulture)
End Get
End Property
Public Overridable Function GetName(ByVal culture As CultureInfo) As String
Return Me.m_name
End Function
End Class
Public Class EnumDisplayNameConverter
Inherits EnumConverter
Public Sub New(ByVal type As Type)
MyBase.New(type)
End Sub
Public Overloads Overrides Function ConvertFrom(ByVal context As ITypeDescriptorContext, ByVal culture As CultureInfo, ByVal valueToConvert As Object) As Object
Dim value As String = TryCast(valueToConvert, String)
If value IsNot Nothing Then
For Each field As FieldInfo In MyBase.EnumType.GetFields()
Dim name As String = Me.GetDisplayName(field, culture)
If name = value Then
Return field.GetValue(Nothing)
End If
Next
End If
Return MyBase.ConvertFrom(context, culture, valueToConvert)
End Function
Public Overloads Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As CultureInfo, ByVal value As Object, ByVal destinationType As Type) As Object
If destinationType Is GetType(String) Then
Dim valueName As String = [Enum].GetName(MyBase.EnumType, value)
If valueName IsNot Nothing Then
Dim field As FieldInfo = MyBase.EnumType.GetField(valueName)
Dim name As String = Me.GetDisplayName(field, culture)
If name IsNot Nothing Then
Return name
End If
End If
End If
Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function
Private Function GetDisplayName(ByVal field As FieldInfo, ByVal culture As CultureInfo) As String
If field Is Nothing Then
Return Nothing
End If
Dim type As Type = GetType(EnumDisplayNameAttribute)
Dim attr As Attribute = Attribute.GetCustomAttribute(field, type)
Dim disp As EnumDisplayNameAttribute = TryCast(attr, EnumDisplayNameAttribute)
Return IIf((disp Is Nothing), Nothing, disp.GetName(culture))
End Function
End Class
</pre></pre>