質問

ストアド プロシージャのフロント エンドとして機能する非常に単純な ASP.Net ページがあります。プロシージャを実行し、グリッドビュー コントロールを使用して出力を表示するだけです。aspx マークアップを含む合計コードは 40 行未満です。ストアド プロシージャ自体は非常に...揮発性。これはさまざまな目的に使用され、出力形式は定期的に変更されます。

Gridview コントロールはストアド プロシージャがどの列を返すかを気にする必要がないため、全体がうまく機能します。ページ上にそれらを表示するだけです。これはまさに私が望んでいることです。

ただし、これが実行されるデータベースには、時刻部分があまり重要ではない、日付時刻列があちこちにあり、常にゼロで設定されます。私ができるようにしたいのは、どの列になるかを正確に知ることなく、グリッドビューの日時列のみの書式設定を制御することです。結果の列に日時型がある場合は、時間コンポーネントを削除する特定の書式文字列を適用するだけです。

データベースで varchar に変換できることはわかっていますが、開発者にクエリ内の書式設定を気にさせたくありません。いずれにしても、これはプレゼンテーション レベルに属します。他に何かアイデアはありますか?


最終的に、次のコードを使用して、許容できる (または少なくとも改善された) 方法で動作するようになりました。

Protected Sub OnRowDatabound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim d As DateTime
        For Each cell As TableCell In e.Row.Cells
            If Date.TryParse(cell.Text, d) AndAlso d.TimeOfDay.Ticks = 0 Then
                cell.Text = d.ToShortDateString()
            End If
        Next cell
    End If
End Sub
役に立ちましたか?

解決

列を自動生成している場合は、そのように聞こえます。グリッドの書式設定を使用する手順はひどいです。

おそらくデータバインドされたイベント内でグリッドのすべての列をループし、日付列であることがわかった列に書式設定式を適用する必要があります。

自動生成を行わず、グリッドに列をコーディングしている場合は、どの列が日付列であるかがすでにわかっているので、その列に同じ書式式を適用できます。これは {0:ddMMyyyy} のようなものですが、おそらく正確ではないため、調べる必要があります。

データバインドされたイベントへのフックを要約します。列コレクションをループし、列が日付列かどうかを確認します。どうやってこれを行うのか不思議です:)。列が日付列であると判断した場合は、その形式式を設定します。

出来上がり

- - - - - - - - - - - 編集

OK、データテーブルを返すためにプロシージャからデータを返すメソッドを書いてみてはどうでしょうか。データテーブル内のデータをフォーマットした後、データテーブルをグリッドにバインドできます。datatable.Columns コレクションは DataColumns のコレクションであり、これらには DataType プロパティがあります。System.DateTime または DateTime を探している可能性があり、それは DataType プロパティ自体のプロパティの 1 つである可能性があります :)。面倒なことはわかっていますが、あなたが求めていることは間違いなく面倒なことです。日付列を特定したら、それを使って何かできるかもしれません。

そうでない場合は、データリーダーを調べて、そこでまたはデータアダプターを使用して何かできるかどうかを確認します。適切な答えができればいいのですが、どのように答えても、それはきれいなものではないと思います。ごめん

他のヒント

明示的なバインドされた列を使用することがオプションの場合、boundFormatにDataFormatStringを追加します

<asp:BoundField DataField="Whatever" ... DataFormatString="{0:dd/MM/yyyy}" HtmlEncode="False"/ > 

それ以外の場合は、GridView.OnRowDataBoundイベントのフォーマット設定を確認できます

isDate()関数を使用して何かが有効な日付であるかどうかを確認し、dateformattingオプションを使用して希望どおりに表示できます。

日付フォーマットのいくつかの例: http://datawebcontrols.com/faqs/CustomizingAppearance/FormatDateTimeData.shtml

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top