4

シンプルな CompositeControl を作成し、Nullable DateTimeOffset プロパティを公開しました。を使用してコントロールを SQL Server DateTimeOffset フィールドにバインドしています

DateTimeOffset='<%# Bind("myDateTimeOffsetField") %>'

これは、DateTimeOffset フィールドに値がある場合にうまく機能します。しかし、フィールドが NULL の場合、「指定されたキャストは無効です」というエラーが表示されます。

フィールドが NULL の場合、このエラーを停止してプロパティを Nothing に設定するにはどうすればよいですか?

これがデフォルトの動作だと思いました!

プロパティの定義は次のとおりです。

Public Property DateTimeOffset As DateTimeOffset?

後のコメント:

Bind の使用から次のように変更すると、これが機能することがわかりました。

DateTimeOffset='<%# iif(IsDbNull(Eval("myDateTimeOffsetField")), Nothing, Eval("myDateTimeOffsetField")) %>'

しかし、その後、FormView.ItemUpdating イベントで "myDateTimeOffsetField" が引数として渡されません (はい、これは FormView コントロールにあります)。これは、ASP.NET がデータベースにバインドしていないと想定しているためです。

実際のコード (リクエストにより追加)

これは、バインドしようとしている複合コントロールのプロパティです。

Public Property DateTimeOffset As DateTimeOffset?
Get
    Return CType(ViewState("DTO"), DateTimeOffset?)
End Get
Set(value As DateTimeOffset?)
    ViewState("DTO") = value
End Set
End Property

バインディングのマークアップを次に示します。コントロールは、オプションの DateTimeOffset 値を持つ [dtoMldRejOn] というフィールドを返す SQL DataSource にバインドされている FormView の EditItemTemplate にあります。

<APS:DateTimeOffsetControl runat="server" id="dtocMldRejOn" TextBoxCssClass="inputdatetime" ValidationGroup="vw1" FieldName="<%$ Resources: Resource, rxgFrom %>" DateTimeOffset='<%# Bind("dtoMldRejOn") %>' WindowsTimeZoneID="<%# me.WindowsTimeZoneID %>" IsRequired="false" />

ご覧のとおり、Composite コントロールは DateTimeOffset 値を処理するためのものです。データベースからの DateTimeOffset フィールド [dtoMldRejOn] が NULL でない限り、すべてうまく機能し、例外が発生します。

4

5 に答える 5

1

以前にバインド可能なコントロールを作成したことはありませんが、提案したいと思います。DateTimeOffsetプロパティを type に設定するのはどうですかObject。そうすれば、プロパティは DBNull を含むすべてのデータ型を受け入れます。

コード内に入っSetたら、渡された値が DBNull.Value かどうかを確認します。その場合、新しい空の DataTimeOffset を作成しますか? オブジェクトを作成し、ViewState に保存します。

DBNull 以外の値で、datetime に変換できない場合はエラーをスローします。

私はこれを試していないので、これが機能するかどうかはわかりません。

################ 更新された回答 ################

私の提案は、次のように 2 つのプロパティを作成することです。

Public Property DateTimeOffset() As DateTimeOffset?
    Get
        Return DirectCast(ViewState("DTO"), DateTimeOffset?)
    End Get
    Set(ByVal Value As DateTimeOffset?)
        ViewState("DTO") = Value
    End Set
End Property

<Bindable(True, BindingDirection.TwoWay)>
Public Property DbDateTimeOffset As Object
    Get
        Return Me.DateTimeOffset
    End Get
    Set(value As Object)
        If IsDBNull(value) OrElse value Is Nothing Then
            Me.DateTimeOffset = New DateTimeOffset?
        Else
            Me.DateTimeOffset = DirectCast(value, DateTimeOffset?)
        End If
    End Set
End Property

したがって、マークアップでは、バインディングはDbDateTimeOffsetプロパティになります。

DbDateTimeOffset='<%# Bind("myDateTimeOffsetField") %>'

コード ビハインドでは、他のプロパティを使用して、キャストせずにプロパティを読み取ることができます。

于 2013-05-04T02:09:23.487 に答える
0

この投稿に基づいて、

Bindableプロパティを次の属性でマークするだけでよいと思います。

<System.ComponentModel.Bindable(True)> _
Public Property DateTimeOffset As DateTimeOffset?
于 2013-05-03T17:40:20.810 に答える
0

この質問はすでに回答されていることを知っています。今日これに出くわしたので、これら2つの回答の間にある私の解決策を文書化したいだけです。

Private _AssetId As Object
<Bindable(True, BindingDirection.TwoWay)>
Public Property AssetId() As Object
    Get
        If _AssetId Is Nothing Then                
             Return Nothing                
        Else
            Return CType(_AssetId, Integer)
        End If
    End Get
    Set(ByVal value As Object)
        If value Is Nothing OrElse IsDBNull(value) OrElse CType(value, String) = "" Then
            _AssetId = Nothing                
        Else
            _AssetId = CType(value, Integer)                
        End If
    End Set
End Property
于 2015-09-10T22:46:00.403 に答える