web-dev-qa-db-ja.com

WPFデータグリッドの日付フォーマット

私はすでに解決策のためにstackoverflowを検索し、これを見つけました:

動的に構築されたWPF DataGridで日付をフォーマットする必要があります

私の問題は、SQL-Server-Databaseからいくつかのデータをロードし、それらをDataGridのWPFアプリケーションに表示することです。これは非常にうまく機能します。変更したいのは、日付列の形式が「DD/MM/YYYY HH:MM:SS」であり、「DD.MM.YYYY」にすることだけです。 OK、それから私は下のリンクを見て、私のプログラムでこれを試しました:

<Grid Width="648" Height="263">

  <Grid.ColumnDefinitions>
       <ColumnDefinition Width="172*" />
       <ColumnDefinition Width="90*" />
       <ColumnDefinition Width="386*" />
  </Grid.ColumnDefinitions>

  <DataGrid Name="dgBuchung" Height="213" HorizontalAlignment="Left" Margin="30,16,0,0"     VerticalAlignment="Top" Width="595" AutoGenerateColumns="True" ItemsSource="{Binding}" Grid.ColumnSpan="3" Foreground="Black" BorderBrush="#FF688CAF" Opacity="1" Background="White" BorderThickness="1" >
 <!-- <ab:DataGridTextColumn Header="Fecha Entrada" Width="110"  
       Binding="{Binding date, StringFormat={}{0:dd/MM/yyyy}}" IsReadOnly="True" />
                        -->
</DataGrid>

</Grid>

コメントアウトされた部分は私の解決方法ですが、XMLParseExceptionをスローします。まず、AutoGenerateColumnsを使用しているときに、この方法で解決できますか?いいえの場合、これをどのように処理できますか?はいの場合、上記のコードの問題は何ですか?

EDIT:アプリケーションを再構築しないことに決めたため私の質問は解決されません。AutoGenerateColumns= trueを使用したソリューションはありませんか?

52
Harald

DataGrid.Columnsを使用することを忘れないでください。すべての列はそのコレクション内になければなりません。私のプロジェクトでは、日付の形式を少し変えています。

<tk:DataGrid>
    <tk:DataGrid.Columns>
        <tk:DataGridTextColumn Binding="{Binding StartDate, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" />
    </tk:DataGrid.Columns>
</tk:DataGrid>

AutoGenerateColumnsでは、DataGirdが独自の列を追加するため、書式設定を制御できません。

100
icebat

ここでのパーティーに非常に遅れましたが、誰かがこのページを偶然見つけた場合に備えて...

それを行うには、XAMLでAutoGeneratingColumnハンドラーを設定します。

<DataGrid AutoGeneratingColumn="OnAutoGeneratingColumn"  ..etc.. />

そして、背後のコードで次のようなことを行います:

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyType == typeof(System.DateTime))
        (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";
}
77
Mark Feldman

バウンドプロパティがDateTimeの場合、必要なのは

Binding={Property, StringFormat=d}
14
Terence
Binding="{Binding YourColumn ,StringFormat='yyyy-MM-dd'}"
4
Dan Andrews

最初にdatagridを選択してから、プロパティに移動してDatagrid_AutoGeneratingColumnを見つけ、ダブルクリックしてからこのコードを使用します

   Datagrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
            {
                if (e.PropertyName == "Your column name")
                    (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MMMMMMMMM/yyyy";
                if (e.PropertyName == "Your column name")
                    (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MMMMMMMMM/yyyy";
            }

私はそれをWPFで動作させてみます

1
ANIL AYDINALP

私は受け入れられた答えがかなり古いことを知っていますが、AutoGeneratColumnsでフォーマットを制御する方法があります:

最初に、列が生成されたときにトリガーする関数を作成します。

<DataGrid x:Name="dataGrid" AutoGeneratedColumns="dataGrid_AutoGeneratedColumns" Margin="116,62,10,10"/>

次に、生成された列の型がDateTimeであるかどうかを確認し、文字列形式を「d」に変更して時間部分を削除します。

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if(YourColumn == typeof(DateTime))
            {
                e.Column.ClipboardContentBinding.StringFormat = "d";
            }
        }
0
Treycos