2011-11-02 23 views
45

Zaten bir çözüm için stackoverflow aradı ve bu bulundu:Tarih biçimlendirme

Need to format dates in dynamically built WPF DataGrid

Sorunum benim SQL Sunucu Veritabanı dışına bazı verileri yüklemek ve bunları göstermek istiyorum yani, WPF uygulamasında bir DataGrid'de. Bu çok iyi çalışıyor. Değiştirmek istediğim tek şey, tarih sütununun "DD/AA/YYYY HH: MM: SS" biçiminde olması ve "DD.MM.YYYY" olmasını istiyorum. Tamam, o zaman ben aşağıdaki linke baktım ve benim programm bu çalıştı:

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

dışarı parçası çözümün yöntemim ama bir XMLParseException atar yorumladı. Her şeyden önce, AutoGenerateColumns kullanırken bu çözüm yolu mümkün mü? Eğer hayır ise, bunu nasıl halledebilirim? Evet ise, yukarıdaki kodla ilgili sorun nedir?

DÜZENLEME: Ben başvurumu yeniden karar çünkü Sorum çözüldü isn't gerçek AutoGenerateColumns = bir çözüm yok mu?

cevap

85

DataGrid.Columns kullanmayı unutmayın, tüm sütunlar bu koleksiyonun içinde olmalıdır. biraz farklı benim proje ben biçimi tarih olarak : Eğer DataGird kendi sütunlar katacak şekilde biçimlendirme contol mümkün sürmez AutoGenerateColumns ile

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

. senin sınır özelliği DateTime ise

+0

çalışır deneyin kullanın Bunun için teşekkür ederim! Projemde bir özellik olmadan bir sütunu veritabanımın dışına bir alana bağlamak mümkün mü? – Harald

+1

@Harald, hayır, doğrudan veritabanı alanına bağlanamazsınız, önce bir nesne oluşturmanız veya oluşturmanız gerekir (örneğin, [Entity Framework] kullanarak (http://msdn.microsoft.com/en-us/library/bb386876) .aspx)). Bu tür nesnelerin bir koleksiyonuna sahipseniz, kodunuzda yaptığınız gibi bunu DataGrid.ItemsSource özelliğine bağlayabilirsiniz. – icebat

+0

bana yardımcı oldu. teşekkürler –

13

, o zaman gereken tüm

Sen bunu yapabilirsin ... Burada partiye ancak bu sayfa boyunca vaka başkasının tökezlemeleri Çok geç

Binding={Property, StringFormat=d} 
62

olduğunu XAML AutoGeneratingColumn işleyicisi ayarı: böyle kod arkasında ardından yok

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

Ve bir şey:

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

Bu harika, bir metin dosyasından veri yüklediğimi ve gittiğimde türleri ayarlamayı seviyorum. – MikeAinOz

+0

Harika! Eğer bir VB.NET sürümü gerekir: Private Sub MyGrid_AutoGeneratingColumn (Nesne Olarak gönderen, e DataGridAutoGeneratingColumnEventArgs gibi) MyGrid.AutoGeneratingColumn \t ise e.PropertyType = GetType (System.DateTime) Sonra \t \t TryCast (e.Column kolları , DataGridTextColumn) .Binding.StringFormat = "gg/aA/yyyy" \t sonu If End Sub AutoGenerateColumns DataGridTextColumn olarak –

+0

büyük yön) .Binding.StringFormat = "d"; // Kısa Tarih biçimini kullanma – cdie

0

Kabul cevap oldukça eski olduğunu biliyorum ama AutoGeneratColumns ile biçimlendirme kontrol etmek için bir yol yoktur: Sonra

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

:

Önce bir sütun oluşturulduğunda tetikleyecek bir işlev oluşturmak oluşturulan sütunun türü bir DateTime olup olmadığını kontrol ve sadece "D" zaman parçasını kaldırmak için onun dize biçimini değiştirmek:

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

ilk veri kılavuzunu seçmek ve özellikleri Datagrid_AutoGeneratingColumn ve çift tıklama bulmaya sonra gidin Ve sonra bu kodu

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

buna Ok WPF