2011-11-02 50 views
45

Tôi đã tìm kiếm stackoverflow kiếm một giải pháp và phát hiện này:Ngày định dạng trong WPF DataGrid

Need to format dates in dynamically built WPF DataGrid

Vấn đề của tôi là, mà tôi tải một số dữ liệu ra của tôi SQL-Server-Cơ sở dữ liệu và muốn cho họ trong ứng dụng WPF của tôi trong một DataGrid. Điều này hoạt động rất tốt. Điều duy nhất tôi muốn thay đổi là cột ngày có định dạng "DD/MM/YYYY HH: MM: SS" và tôi muốn có "DD.MM.YYYY". Ok, sau đó tôi nhìn vào liên kết dưới đây và thử điều này trong programm tôi:

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

Các nhận xét ra phần là cách của tôi về giải pháp nhưng nó ném một XMLParseException. Trước hết, đây có phải là cách giải pháp có thể khi sử dụng AutoGenerateColumns không? Nếu không, tôi có thể xử lý điều này bằng cách nào khác? Nếu có, vấn đề với mã ở trên là gì?

EDIT: Câu hỏi của tôi chưa được giải quyết vì tôi quyết định không xây dựng lại ứng dụng, không có giải pháp với AutoGenerateColumns = true?

Trả lời

85

Đừng quên sử dụng DataGrid.Columns, tất cả các cột phải nằm trong bộ sưu tập đó. Trong ngày tôi định dạng dự án của tôi hơi khác một chút:

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

Với AutoGenerateColumns bạn won `t có thể contol định dạng như DataGird sẽ thêm các cột riêng của mình.

+0

Ok, cảm ơn bạn vì điều đó! Có thể gắn một Cột vào một trường trong cơ sở dữ liệu của tôi mà không cần có thuộc tính trong dự án của tôi không? – Harald

+1

@Harald, không, bạn không thể liên kết trực tiếp với trường cơ sở dữ liệu, trước tiên bạn phải tạo hoặc tạo một số đối tượng (ví dụ: sử dụng [Entity Framework] (http://msdn.microsoft.com/en-us/library/bb386876 .aspx)). Nếu bạn đã có một bộ sưu tập các đối tượng như vậy, thì bạn có thể liên kết nó với thuộc tính DataGrid.ItemsSource, như bạn đã làm trong mã của mình. – icebat

+0

nó đã giúp tôi. cảm ơn –

13

Nếu tài sản bị ràng buộc của bạn là DateTime, sau đó tất cả các bạn cần là

Binding={Property, StringFormat=d} 
62

Rất muộn để bên đây nhưng trong trường hợp bất cứ ai tình cờ khác trên trang này ...

Bạn có thể làm điều đó bằng cách thiết lập các handler AutoGeneratingColumn trong XAML:

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

Và sau đó ở phía sau đang làm một cái gì đó như thế này:

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

Thật thú vị, tôi thích rằng tôi đang tải dữ liệu từ một tệp văn bản và thiết lập các loại như tôi đi. – MikeAinOz

+0

Tuyệt vời! Trong trường hợp bạn cần một phiên bản VB.NET: Private Sub MyGrid_AutoGeneratingColumn (người gửi Như Object, e Như DataGridAutoGeneratingColumnEventArgs) xử lý MyGrid.AutoGeneratingColumn \t Nếu e.PropertyType = GetType (System.DateTime) Sau đó \t \t TryCast (e.Column , DataGridTextColumn) .Binding.StringFormat = "dd/MM/yyyy" \t Kết thúc Nếu Kết thúc phụ –

+0

Cách tuyệt vời để sử dụng autogeneratecolumns – cdie

0

tôi biết câu trả lời được chấp nhận là khá cũ, nhưng có một cách để kiểm soát định dạng với AutoGeneratColumns:

Đầu tiên tạo một hàm sẽ kích hoạt khi một cột được tạo ra:

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

Sau đó, kiểm tra xem loại cột được tạo là DateTime và chỉ cần thay đổi định dạng Chuỗi thành "d" để xóa phần thời gian:

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

trước chọn DataGrid và sau đó đi đến các thuộc tính tìm Datagrid_AutoGeneratingColumn và nhấn đúp chuột Và sau đó sử dụng mã này

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

tôi thử nó nó hoạt động trên WPF