2

うまくいけば、これはばかげた質問です (簡単に答えられるはずです)。

必要なフィールドのタイプに応じて、TextBox、いくつかのバリデーター、その他のものをカプセル化する複合サーバー コントロールを作成しようとしています。

私のコントロールには、何を表示するかを決定できる「DataType」値があります。たとえば、DataType が「Date」の場合、AjaxControlToolkit.CalendarExtender などをレンダリングします。

私の一般的な「Value」プロパティはオブジェクトであり、DataType プロパティが要求するものは何でも返すため、上記の例では、Value は Date 型になります。

ここに私の問題があります。受信した Value プロパティを、実行時に DataType が要求するものに変換する必要があります。

ご覧のとおり、 TypeConverter を作成しようとしましたが、うまくいかないようで、コンパイル中に次のエラーが発生します。

タイプ 'System.Object' の値のコードを生成できません。このエラーは、Value のプロパティ値を生成しようとしたときに発生しました。

どんな助けでも大歓迎です!

コントロールを呼び出そうとする方法は次のとおりです。

<custom:SomeTextControl ID="dateFoo" runat="server" DataType="Date" Value="08/11/2009" />

これが私のクラスです:

Public Class SomeTextControl
Inherits Control

  Private _Value as Object
  <Bindable(True), TypeConverter(GetType(ObjectConverter))> _
  Public Property Value() As Object
    Get
        Return _Value
    End Get
    Set(ByVal value As Object)
        _Value = value
    End Set
  End Property
End Class

Public Class ObjectConverter
    Inherits TypeConverter

    Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
        Dim o As Object
        o = value
        Return o
    End Function

    Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
        If sourceType Is GetType(String) Then
            Return True
        End If
        Return MyBase.CanConvertFrom(context, sourceType)
    End Function

    Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
        If destinationType Is GetType(String) Then
            Return True
        End If
        Return MyBase.CanConvertTo(context, destinationType)
    End Function
End Class
4

1 に答える 1

1

それで、私はそれを自分で半分理解したようです...熱心に質問をするのは大変です。

とにかく、destinationType が InstanceDescriptor (当然) かどうかを確認するのを忘れていたようです。オブジェクトを文字列に設定する必要があることを理解するのにさらに数分かかることがわかったら(または他の何かに設定する必要がありますが、とにかくテキストボックスに吐き出すだけなので、文字列を選択しています) Object はコンストラクターを取らないためです。

何か良いアイデアがあれば教えてください。

だから私はこのTypeConverterで終わった:

Friend Class ObjectConverter
    Inherits TypeConverter

    Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
        Return value
    End Function

    Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
        If sourceType Is GetType(String) Then
            Return True
        ElseIf sourceType Is GetType(InstanceDescriptor) Then
            Return True
        End If
        Return MyBase.CanConvertFrom(context, sourceType)
    End Function

    Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
        If destinationType Is GetType(String) Then
            Return True
        ElseIf destinationType Is GetType(InstanceDescriptor) Then
            Return True
        End If
        Return MyBase.CanConvertTo(context, destinationType)
    End Function

    Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
        If destinationType Is GetType(InstanceDescriptor) Then
            Dim constructor As ConstructorInfo = GetType(String).GetConstructor(New Type() {GetType(Char())})
            Dim instance As New InstanceDescriptor(constructor, New Object() {CType(value.ToString, Char())})
            Return instance
        End If

        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function
End Class
于 2009-08-21T17:37:43.317 に答える