WPF 데이터 그리드의 날짜 형식
변경하고자 하는 날짜 열은 "DD/MM/YYY HH:MM:SS에서 DD로.MM.YYY" 라고 표시됩니다.
<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를 사용하면서 이 방법으로 해결할 수 있습니까?그렇지 않은 경우 다른 방법으로 이 문제를 해결하려면 어떻게 해야 합니까?
만약 그렇다면 위의 코드에 어떤 문제가 있습니까?
Data Grid를 사용하는 것을 잊지 마십시오.열, 모든 열은 해당 집합 안에 있어야 합니다.프로젝트에서는 날짜를 조금 다르게 포맷합니다.
<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가 자체 열을 추가하기 때문에 포맷을 제어할 수 없습니다.
파티에 늦었지만 혹시 다른 사람이 이 페이지를 넘길까봐...
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";
}
바인딩된 속성이 DateTime인 경우 필요한 것은
Binding={Property, StringFormat=d}
Binding="{Binding YourColumn ,StringFormat='yyyy-MM-dd'}"
먼저 데이터그램을 선택하고 속성으로 이동하여 데이터그램을 찾습니다.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에서 동작하도록 하겠습니다.
승인된 답변이 꽤 오래된 것은 알지만 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";
}
}
이것은 매우 오래된 질문이지만, 저는 새로운 해결책을 발견했기 때문에 그것에 대해 썼습니다.
먼저 AutoGenerateColumns를 사용하면서 이 방법으로 해결할 수 있습니까?
네, Attached Property를 사용하여 다음과 같이 할 수 있습니다.
<DataGrid AutoGenerateColumns="True"
local:DataGridOperation.DateTimeFormatAutoGenerate="yy-MM-dd"
ItemsSource="{Binding}" />
Attached Property(접속 속성)
2개의 형식을 지정할 수 있는2개의 Attached Property가 정의되어 있습니다. DateTimeFormatAutoGenerate
위해서DateTime
그리고.TimeSpanFormatAutoGenerate
위해서TimeSpan
.
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;
}
언급URL : https://stackoverflow.com/questions/7978249/date-formatting-in-wpf-datagrid
'programing' 카테고리의 다른 글
어떤 iOS 버전이 실행 중인지 프로그래밍 방식으로 감지하려면 어떻게 해야 합니까? (0) | 2023.04.20 |
---|---|
Asp.NET Web API - 405 - 이 페이지에 액세스하는 데 사용되는 HTTP 동사는 허용되지 않습니다 - 핸들러 매핑 설정 방법 (0) | 2023.04.20 |
WPF - 명령의 CanExecute가 false일 경우 메뉴 항목을 숨기는 방법 (0) | 2023.04.20 |
VBA에서 폼에서 모듈로의 변수 전달 (0) | 2023.04.20 |
MVVM에서 ViewModelBase를 쓰는 방법 (0) | 2023.04.20 |