【问题标题】:Date formatting in WPF datagridWPF 数据网格中的日期格式
【发布时间】:2011-12-20 03:57:58
【问题描述】:

我想将日期列从格式“DD/MM/YYYY HH:MM:SS”更改为“DD.MM.YYYY”。

  <DataGrid Name="dgBuchung" AutoGenerateColumns="True" 
            ItemsSource="{Binding}" Grid.ColumnSpan="3" >
  <ab:DataGridTextColumn Header="Fecha Entrada" Width="110"  
       Binding="{Binding date, StringFormat={}{0:dd/MM/yyyy}}" IsReadOnly="True" />
                        
</DataGrid>
                                      

不幸的是,该代码抛出了XMLParseException

首先,在使用 AutoGenerateColumns 时,这种解决方法可行吗? 如果没有,我还能如何尝试处理?

如果是,上面的代码有什么问题?

【问题讨论】:

    标签: c# wpf datagrid date-formatting


    【解决方案1】:

    不要忘记使用 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 会添加自己的列。

    【讨论】:

    • 好的,谢谢!是否可以在我的项目中没有属性的情况下将列绑定到数据库中的字段?
    • @Harald,不,您不能直接绑定到数据库字段,首先您必须制作或生成一些对象(例如,使用Entity Framework)。如果您已经拥有此类对象的集合,则可以将其绑定到 DataGrid.ItemsSource 属性,就像您在代码中所做的那样。
    • 非常感谢!这篇文章救了我!
    • @Kiquenet,如果您对每种文化都有一些自定义格式,那么您最好将该逻辑移至 Converter 或属性获取器。否则,您可以使用 custom date formatting 查看更多选项
    • @KonradViltersten,它是string.Format 的索引,在应用StringFormat 时使用。
    【解决方案2】:

    在这里聚会很晚,但以防其他人偶然发现此页面...

    您可以通过在 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";
    }
    

    【讨论】:

    • 这很酷,我喜欢从文本文件中加载数据并随时设置类型。
    • 太棒了!如果您需要 VB.NET 版本: Private Sub MyGrid_AutoGeneratingColumn(sender As Object, e As DataGridAutoGeneratingColumnEventArgs) 处理 MyGrid.AutoGeneratingColumn If e.PropertyType = GetType(System.DateTime) Then TryCast(e.Column, DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy" End If End Sub
    • 使用自动生成列的好方法
    • (e.Column as DataGridTextColumn).Binding.StringFormat = "d"; // 使用短日期格式
    • 我会使用 DataGridBoundColumn 而不是 DataGridTextColumn 更通用。
    【解决方案3】:

    如果您的绑定属性是 DateTime,那么您只需要

    Binding={Property, StringFormat=d}
    

    【讨论】:

    • 工作就像一个魅力。需要不干扰系统格式的格式化。
    【解决方案4】:
    Binding="{Binding YourColumn ,StringFormat='yyyy-MM-dd'}"
    

    【讨论】:

    • 请添加您的代码解释,这将大大提高答案的质量。
    【解决方案5】:

    首先选择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

    【讨论】:

    • 虽然我在我的项目中使用 Mark Feldman,但当您拥有相同类型的不同属性并且您希望每个属性具有不同格式时,您的解决方案非常有用。
    【解决方案6】:

    我知道接受的答案已经很老了,但是有一种方法可以使用 AutoGeneratColumns 控制格式:

    首先创建一个在生成列时触发的函数:

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

    然后检查生成的列的类型是否为 DateTime 并将其 String 格式更改为“d”以删除时间部分:

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

    【讨论】:

    • 马克·费尔德曼已经回答了。
    【解决方案7】:

    这是一个很老的问题,但我找到了一个新的解决方案,所以我写了。

    首先,在使用 AutoGenerateColumns 时这种解决方法可行吗?

    是的,可以使用 AttachedProperty 完成,如下所示。

    <DataGrid AutoGenerateColumns="True" 
       local:DataGridOperation.DateTimeFormatAutoGenerate="yy-MM-dd"
       ItemsSource="{Binding}" />
    

    附加属性

    定义了两个 AttachedProperty,允许您指定两种格式。 DateTimeFormatAutoGenerateDateTimeTimeSpanFormatAutoGenerateTimeSpan

    class DataGridOperation
    {
        public static string GetDateTimeFormatAutoGenerate(DependencyObject obj) => (string)obj.GetValue(DateTimeFormatAutoGenerateProperty);
        public static void SetDateTimeFormatAutoGenerate(DependencyObject obj, string value) => obj.SetValue(DateTimeFormatAutoGenerateProperty, value);
        public static readonly DependencyProperty DateTimeFormatAutoGenerateProperty =
            DependencyProperty.RegisterAttached("DateTimeFormatAutoGenerate", typeof(string), typeof(DataGridOperation),
                new PropertyMetadata(null, (d, e) => AddEventHandlerOnGenerating<DateTime>(d, e)));
    
        public static string GetTimeSpanFormatAutoGenerate(DependencyObject obj) => (string)obj.GetValue(TimeSpanFormatAutoGenerateProperty);
        public static void SetTimeSpanFormatAutoGenerate(DependencyObject obj, string value) => obj.SetValue(TimeSpanFormatAutoGenerateProperty, value);
        public static readonly DependencyProperty TimeSpanFormatAutoGenerateProperty =
            DependencyProperty.RegisterAttached("TimeSpanFormatAutoGenerate", typeof(string), typeof(DataGridOperation),
                new PropertyMetadata(null, (d, e) => AddEventHandlerOnGenerating<TimeSpan>(d, e)));
    
        private static void AddEventHandlerOnGenerating<T>(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (!(d is DataGrid dGrid))
                return;
    
            if ((e.NewValue is string format))
                dGrid.AutoGeneratingColumn += (o, e) => AddFormat_OnGenerating<T>(e, format);
        }
    
        private static void AddFormat_OnGenerating<T>(DataGridAutoGeneratingColumnEventArgs e, string format)
        {
            if (e.PropertyType == typeof(T))
                (e.Column as DataGridTextColumn).Binding.StringFormat = format;
        }
    }
    

    如何使用

    查看

    <Window
       x:Class="DataGridAutogenerateCustom.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:local="clr-namespace:DataGridAutogenerateCustom"
       Width="400" Height="250">
       <Window.DataContext>
          <local:MainWindowViewModel />
       </Window.DataContext>
       <StackPanel>
          <TextBlock Text="DEFAULT FORMAT" />
          <DataGrid ItemsSource="{Binding Dates}" />
    
          <TextBlock Margin="0,30,0,0" Text="CUSTOM FORMAT" />
          <DataGrid
             local:DataGridOperation.DateTimeFormatAutoGenerate="yy-MM-dd"
             local:DataGridOperation.TimeSpanFormatAutoGenerate="dd\-hh\-mm\-ss"
             ItemsSource="{Binding Dates}" />
       </StackPanel>
    </Window>
    

    视图模型

    public class MainWindowViewModel
    {
        public DatePairs[] Dates { get; } = new DatePairs[]
        {
            new (){StartDate= new (2011,1,1), EndDate= new (2011,2,1) },
            new (){StartDate= new (2020,1,1), EndDate= new (2021,1,1) },
        };
    }
    
    public class DatePairs
    {
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
        public TimeSpan Span => EndDate - StartDate;
    }
    

    demo_wpf_datagrid

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 2017-10-23
      • 2016-05-24
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      相关资源
      最近更新 更多