c# - 如何以编程方式将 DataGrid 列设置为 DatePicker 输入

标签 c# wpf datagrid datatable datepicker

有几篇文章解释了如何在 DataGrid 中创建特定列 DatePickers , DatePickers , 或 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>

结果是:

enter image description here

有没有办法在 C# 中执行 in?

我从 SQL 数据库输入 DataTable 并将其绑定(bind)到 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 的模板的日期?

在这个例子中,因为标题是相同的,如果我在左边的列中选择一个日期,一旦我按下回车键,它就会进入右边的日期列并被保存,这很好。不过,我只希望它们是同一列。

有什么想法吗?

enter image description here

最佳答案

如果您不必自动生成列,有很多解决方案,但我必须允许动态添加和删除列,因此没有办法解决它。

这是有效的:

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>

enter image description here

关于c# - 如何以编程方式将 DataGrid 列设置为 DatePicker 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28035239/

相关文章:

c# - 将 SQL 列中的项目与数组进行比较

c# - 使用主题时更改按钮的默认背景颜色?

c# - 将命令附加到 TreeView 子项 - 与嵌套子项不同

c# - WPF MVVM : Binding a different ViewModel to each TabItem?

reactjs - Devextreme DataGrid 与 Ag-Grid 相比如何进行 react

c# - 在具有长时间运行进程的 View 上使用 MVVM

c# - Action、Func 和 Predicate 委托(delegate) - C#

silverlight - 更改RIA服务中的默认“输入格式不正确”验证错误

c# - 如何将 XML 读入数据集

c# - 使用动态方法创建类