簡體   English   中英

如何通過編程將DataGrid列設置為DatePicker輸入

[英]How to set a DataGrid column to DatePicker input programmatically

有幾篇文章解釋了如何在DataGrid DatePickersDatePickersDateTimePickers中創建特定的列,但是它們都是通過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加載的dates列就像taskTable.DataContext = dataTable.DefaultView; 我能否以某種方式使date列與C#中的DataTable中的數據與XAML的Templates下的日期相同?

在此示例中,因為標題相同,所以如果我在左列中選擇一個日期,則按Enter鍵后它將進入右邊的日期列中並保存,這很好。 我只是希望它們成為同一列。

有任何想法嗎?

在此處輸入圖片說明

如果您不必自動生成列,則有很多解決方案,但是我不得不允許動態添加和刪除列,因此無法解決。

這是起作用的:

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>

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM