1

ストアド プロシージャのフロント エンドとして機能する非常に単純な ASP.Net ページがあります。プロシージャを実行するだけで、gridview コントロールを使用して出力が表示されます。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
4

3 に答える 3

2

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

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

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

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

出来上がり

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

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

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

于 2008-10-30T17:07:12.853 に答える
2

明示的にバインドされた列を使用するオプションがある場合は、boundField に DataFormatString を追加します

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

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

于 2008-10-30T17:08:16.707 に答える
0

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

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

于 2008-10-30T17:07:00.750 に答える