如何以编程方式将 DataGrid 列设置为 DatePicker 输入
How to set a DataGrid column to DatePicker input programmatically
有几篇文章解释了如何在 DataGrid 中创建特定的列 DatePickers, DatePickers, or DateTimePickers,但它们都是通过 XAML 完成的。做这样的事情:
<DataGrid AutoGenerateColumns="True">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding Date}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
结果:
有没有在 C# 中执行的方法?
我从 SQL 数据库输入一个 DataTable 并将其绑定到 DataGrid。像这样:
dataGrid.DataContext = dataTable.AsDataView();
// or maybe dataGrid.ItemsSource = dataTable.DefaultView;
// I'm not sure what the difference is
我的 XAML 是这样的:
<DataGrid RowEditEnding="updateDatabase" ItemsSource="{Binding}" AutoGenerateColumns="True">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Visibility" Value="{Binding Visibility}" />
</Style>
</DataGrid.RowStyle>
</DataGrid>
我可以这样走:
dataTable.Rows[0][15] = new DateTime(1991, 9, 2);
或
DatePicker dp = new DatePicker();
dp.SelectedDate = DateTime.Today;
dataTable.Rows[0][14] = dp;
但是那些最终只是单元格中的日期字符串,而不是 DatePicker 输入类型?有什么办法可以做到这一点?例如
dataTable.Columns[13].DataType.Equals(typeof(DatePicker));
dataTable.Columns[13].DataType.Equals(typeof(DatePickerTextBox));
提前致谢。
编辑:
如果能通过XAML部分完成也行。例如,如果我让我的 XMAL:
<DataGrid RowEditEnding="updateDatabase" Name="taskTable" ItemsSource="{Binding}" AutoGenerateColumns="True" HorizontalAlignment="Left" Margin="25,50,25,25" VerticalAlignment="Top" Grid.IsSharedSizeScope="True" SelectionChanged="DataGrid_SelectionChanged_1">
<!-- VirtualizingStackPanel.IsVirtualizing="False" -->
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Visibility" Value="{Binding Visibility}" />
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTemplateColumn Header="dates">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding dates}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我加载的 DataTable 中的日期列是这样 taskTable.DataContext = dataTable.DefaultView;
我能否以某种方式使日期列相同,C# 中 DataTable 中的数据在日期下,模板来自 XAML?
在这个例子中,因为 headers 是相同的,如果我 Select 在左栏中输入一个日期,一旦我按下回车键,它就会进入右侧的日期栏,并且保存哪个好。不过我只是希望它们是同一列。
有什么想法吗?
如果您不必自动生成列,则有很多解决方案,但我必须允许动态添加和删除列,因此没有办法解决。
这是有效的方法:
C#
里面public partial class MainWindow: window
public string [] dates = {"COLUMN NAMES", "THAT NEED", "TO BE DATES"};
public void addColumnTemplates(object sender, DataGridAutoGeneratingColumnEventArgs e){
string header = e.Column.Header.ToString();
if ( dates.Contains(header) )
{
MyDataGridTemplateColumn col = new MyDataGridTemplateColumn();
col.ColumnName = e.PropertyName;
col.CellTemplate = (DataTemplate)FindResource("datePickerTemplate");
e.Column = col;
e.Column.Header = e.PropertyName;
}
}
外面public partial class MainWindow: window
public class MyDataGridTemplateColumn : DataGridTemplateColumn
{
public string ColumnName
{
get;
set;
}
protected override System.Windows.FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
ContentPresenter cp = (ContentPresenter)base.GenerateElement(cell, dataItem);
BindingOperations.SetBinding(cp, ContentPresenter.ContentProperty, new Binding(this.ColumnName));
return cp;
}
}
public class MyData
{
public MyData(string name, bool data) { nameData = name; showData = data; }
public string nameData { get; set; }
public bool showData { get; set; }
}
XMAL
对于数据模板:
<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="datePickerTemplate">
<DatePicker Text="{Binding}"
></DatePicker>
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
这是我的数据网格 XMAL
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True"
AutoGeneratingColumn="addColumnTemplates">
</DataGrid>
有几篇文章解释了如何在 DataGrid 中创建特定的列 DatePickers, DatePickers, or DateTimePickers,但它们都是通过 XAML 完成的。做这样的事情:
<DataGrid AutoGenerateColumns="True">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding Date}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
结果:
有没有在 C# 中执行的方法?
我从 SQL 数据库输入一个 DataTable 并将其绑定到 DataGrid。像这样:
dataGrid.DataContext = dataTable.AsDataView();
// or maybe dataGrid.ItemsSource = dataTable.DefaultView;
// I'm not sure what the difference is
我的 XAML 是这样的:
<DataGrid RowEditEnding="updateDatabase" ItemsSource="{Binding}" AutoGenerateColumns="True">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Visibility" Value="{Binding Visibility}" />
</Style>
</DataGrid.RowStyle>
</DataGrid>
我可以这样走:
dataTable.Rows[0][15] = new DateTime(1991, 9, 2);
或
DatePicker dp = new DatePicker();
dp.SelectedDate = DateTime.Today;
dataTable.Rows[0][14] = dp;
但是那些最终只是单元格中的日期字符串,而不是 DatePicker 输入类型?有什么办法可以做到这一点?例如
dataTable.Columns[13].DataType.Equals(typeof(DatePicker));
dataTable.Columns[13].DataType.Equals(typeof(DatePickerTextBox));
提前致谢。
编辑:
如果能通过XAML部分完成也行。例如,如果我让我的 XMAL:
<DataGrid RowEditEnding="updateDatabase" Name="taskTable" ItemsSource="{Binding}" AutoGenerateColumns="True" HorizontalAlignment="Left" Margin="25,50,25,25" VerticalAlignment="Top" Grid.IsSharedSizeScope="True" SelectionChanged="DataGrid_SelectionChanged_1">
<!-- VirtualizingStackPanel.IsVirtualizing="False" -->
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Visibility" Value="{Binding Visibility}" />
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTemplateColumn Header="dates">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding dates}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我加载的 DataTable 中的日期列是这样 taskTable.DataContext = dataTable.DefaultView;
我能否以某种方式使日期列相同,C# 中 DataTable 中的数据在日期下,模板来自 XAML?
在这个例子中,因为 headers 是相同的,如果我 Select 在左栏中输入一个日期,一旦我按下回车键,它就会进入右侧的日期栏,并且保存哪个好。不过我只是希望它们是同一列。
有什么想法吗?
如果您不必自动生成列,则有很多解决方案,但我必须允许动态添加和删除列,因此没有办法解决。
这是有效的方法:
C#
里面public partial class MainWindow: window
public string [] dates = {"COLUMN NAMES", "THAT NEED", "TO BE DATES"};
public void addColumnTemplates(object sender, DataGridAutoGeneratingColumnEventArgs e){
string header = e.Column.Header.ToString();
if ( dates.Contains(header) )
{
MyDataGridTemplateColumn col = new MyDataGridTemplateColumn();
col.ColumnName = e.PropertyName;
col.CellTemplate = (DataTemplate)FindResource("datePickerTemplate");
e.Column = col;
e.Column.Header = e.PropertyName;
}
}
外面public partial class MainWindow: window
public class MyDataGridTemplateColumn : DataGridTemplateColumn
{
public string ColumnName
{
get;
set;
}
protected override System.Windows.FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
ContentPresenter cp = (ContentPresenter)base.GenerateElement(cell, dataItem);
BindingOperations.SetBinding(cp, ContentPresenter.ContentProperty, new Binding(this.ColumnName));
return cp;
}
}
public class MyData
{
public MyData(string name, bool data) { nameData = name; showData = data; }
public string nameData { get; set; }
public bool showData { get; set; }
}
XMAL
对于数据模板:
<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="datePickerTemplate">
<DatePicker Text="{Binding}"
></DatePicker>
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
这是我的数据网格 XMAL
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True"
AutoGeneratingColumn="addColumnTemplates">
</DataGrid>