シンプルな 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 でない限り、すべてうまく機能し、例外が発生します。