C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: コンポーンネントを作成、プロパティ値を日本語表示


(過去ログ 36 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■18297 / inTopicNo.1)  コンポーンネントを作成、プロパティ値を日本語表示
  
□投稿者/ E+ (6回)-(2008/05/12(Mon) 22:05:53)

分類:[VB.NET/VB2005] 

vb2005でボタンを継承したコンポーネントを作成し
選択可能な項目を日本語表示でプロパティにセットしたいのですが
こんな事可能なのでしょうか?
(列挙体を日本語で宣言せずにソース内部では英数字で記述したい。)

現状:
列挙体で指定した値をenumコンバータ属性を付けてみたのですが、
デザイナで見ると最初の一項目だけ日本語表示し、リストを開くと
リスト内部には一項目しかない状態で空白を選択すると落ちてしまいます。

もしやプロパティグリッドにこのコンポーネントを代入して、
ボタンクラスを継承したクラスのプロパティに入れる事ができるのでしょうか?
ちなみにやり方は全然検討もつきませんが、、、

どなたか宜しければご教授願います。
引用返信 編集キー/
■18298 / inTopicNo.2)  Re[1]: コンポーンネントを作成、プロパティ値を日本語表示
□投稿者/ 魔界の仮面弁士 (724回)-(2008/05/12(Mon) 22:46:29)
No18297 (E+ さん) に返信
> 列挙体で指定した値をenumコンバータ属性を付けてみたのですが、
下記で提案されているような実装でしょうか?
http://bbs.wankuma.com/index.cgi?mode=al2&namber=7087&KLOG=18

> デザイナで見ると最初の一項目だけ日本語表示し、リストを開くと
> リスト内部には一項目しかない状態で空白を選択すると落ちてしまいます。
問題が発生しているコンバータの、具体的なコードを提示する事は出来ますか?
引用返信 編集キー/
■18302 / inTopicNo.3)  Re[2]: コンポーンネントを作成、プロパティ値を日本語表示
□投稿者/ E+ (8回)-(2008/05/13(Tue) 00:58:43)
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>

引用返信 編集キー/
■18303 / inTopicNo.4)  Re[3]: コンポーンネントを作成、プロパティ値を日本語表示
□投稿者/ Azulean (106回)-(2008/05/13(Tue) 01:09:34)
> Return IIf((disp Is Nothing), Nothing, disp.GetName(culture))
IIfは関数なので、第1引数の条件によらず、第3引数が評価されているのでしょう。
よって、dispがNothing(null)の時にNullReferenceExceptionが起きます。

試しに、Sampleをフォームに貼り付けず、PropertyGridコントロールをフォームに貼り付け、次のようなコードを書くと、問題を明確にしやすいかと思います。
(デバッグするやり方を確立することが大切)

Public Class Form1

Dim sampleInstance As New Sample()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
PropertyGrid1.SelectedObject = sampleInstance
End Sub
End Class

引用返信 編集キー/
■18385 / inTopicNo.5)  Re[4]: コンポーンネントを作成、プロパティ値を日本語表示
□投稿者/ E+ (9回)-(2008/05/13(Tue) 22:44:55)
どうもありがとうございます。
無事解決できました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -