Форматирование даты в сетке данных WPF - PullRequest
52 голосов
/ 02 ноября 2011

Я уже искал stackoverflow для решения и нашел это:

Необходимость форматировать даты в динамически создаваемой WPF DataGrid

Моя проблема в том, что я загружаю некоторые данныеиз моей базы данных SQL-Server и хочу показать их в моем приложении WPF в DataGrid.Это работает очень хорошо.Единственное, что я хочу изменить, это то, что столбец даты имеет формат «ДД / ММ / ГГГГ ЧЧ: ММ: СС», и я хочу иметь «ДД.ММ.ГГГГ».Хорошо, тогда я посмотрел на ссылку ниже и попробовал это в моей программе:

<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?Если нет, как еще я могу попытаться справиться с этим?Если да, в чем проблема с кодом выше?

РЕДАКТИРОВАТЬ: Мой вопрос не решен, потому что я решил не перестраивать свое приложение, нет ли решения с AutoGenerateColumns =правда?

Ответы [ 6 ]

98 голосов
/ 02 ноября 2011

Не забудьте использовать 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 добавит свои собственные столбцы.

76 голосов
/ 15 мая 2013

Очень поздно на вечеринку здесь, но на случай, если кто-нибудь еще наткнется на эту страницу ...

Вы можете сделать это, установив обработчик AutoGeneratingColumn в XAML:

<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";
}
14 голосов
/ 04 апреля 2013

Если вашим связанным свойством является DateTime, тогда все, что вам нужно, это

Binding={Property, StringFormat=d}
4 голосов
/ 26 июля 2018
Binding="{Binding YourColumn ,StringFormat='yyyy-MM-dd'}"
1 голос
/ 29 августа 2017

сначала выберите сетку данных, а затем перейдите в свойства, найдите 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

0 голосов
/ 09 июня 2017

Я знаю, что принятый ответ довольно старый, но есть способ контролировать форматирование с помощью 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";
            }
        }
...