web-dev-qa-db-fra.com

Formatage de la date dans la grille de données WPF

J'ai déjà cherché une solution dans stackoverflow et trouvé ceci: 

Nécessité de formater les dates dans WPF DataGrid construit de manière dynamique

Mon problème est que je charge certaines données de ma base de données SQL-Server et que je souhaite les afficher dans mon application WPF dans un DataGrid. Cela fonctionne très bien. La seule chose que je veux changer, c'est que la colonne de date est au format "JJ/MM/AAAA HH: MM: SS" et que je souhaite avoir "JJ.MM.AAAA". Ok, alors j'ai regardé le lien ci-dessous et essayé ceci dans mon programme: 

<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>

La partie commentée est ma façon de résoudre le problème, mais elle génère une exception XMLParseException. Tout d’abord, cette solution est-elle possible avec AutoGenerateColumns? Si non, comment puis-je essayer de gérer cela? Si oui, quel est le problème avec le code ci-dessus?

EDIT: Ma question n’a pas été résolue parce que j’ai décidé de ne pas reconstruire mon application, n’existe-t-il pas de solution avec AutoGenerateColumns = true?

50
Harald

N'oubliez pas d'utiliser DataGrid.Columns, toutes les colonnes doivent figurer dans cette collection . Dans mon projet, le format de la date est un peu différent

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

Avec AutoGenerateColumns, vous ne pourrez pas contrôler la mise en forme car DataGird ajoutera ses propres colonnes.

97
icebat

Très tard pour la fête ici mais au cas où quelqu'un d’autre trébuche sur cette page ...

Vous pouvez le faire en définissant le gestionnaire AutoGeneratingColumn dans XAML:

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

Et ensuite, derrière le code, faites quelque chose comme ça:

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

Si votre propriété liée est DateTime, tout ce dont vous avez besoin est 

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

commencez par sélectionner datagrid, puis allez dans les propriétés, recherchez Datagrid_AutoGeneratingColumn et double-cliquez sur Utilisez ensuite ce code 

   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";
            }

Je l'essaie ça marche sur WPF

0
ANIL AYDINALP

Je sais que la réponse acceptée est assez ancienne, mais il existe un moyen de contrôler le formatage avec AutoGeneratColumns: 

Commencez par créer une fonction qui se déclenchera lorsqu'une colonne est générée: 

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

Puis vérifiez si le type de colonne généré est un DateTime et modifiez simplement son format de chaîne en "d" pour supprimer la partie heure: 

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