quator Ответов: 1

Datagrid с datepicker и dateformat


У меня есть таблица данных с элементом управления datepicker. Только формат даты должен быть другим. Как правильно получить формат даты?

Что я уже пробовал:

Private Sub gridAddColumnDate(dc As DataColumn)
    Dim sColumnName As String = dc.ColumnName
    Dim col As New DataGridTemplateColumn
    Dim fac As New FrameworkElementFactory(GetType(DatePicker))
    Dim b As New Binding(sColumnName)

    b.StringFormat = "dd/mmm/yyyy"
    fac.SetValue(DatePicker.SelectedDateProperty, b)

    fac.SetValue(FontFamilyProperty, New FontFamily("Microsoft Sans Serif"))
    fac.SetValue(DatePicker.VerticalContentAlignmentProperty, VerticalAlignment.Center)
    fac.AddHandler(DatePicker.LostFocusEvent, New RoutedEventHandler(AddressOf DateSelectionChanged))

    Dim cellil As New DataTemplate
    With cellil
        .VisualTree = fac
    End With

    With col
        .Header = "Date !!"
        .Width = 100
        .CellEditingTemplate = cellil
        .CellTemplate = cellil
        .SortMemberPath = sColumnName
    End With

    Ctr.Columns.Add(col)
End Sub

1 Ответов

Рейтинг:
0

Graeme_Grant

<DatePicker SelectedDate="{Binding PropertyName, StringFormat=dd/MM/yyyy}"/>

ОБНОВЛЕНИЕ: Рабочий пример ниже с DataGridTextColumn & a DataGridTemplateColumn тип столбца.

1. Code-Behind (работает так же для MVVM):
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Mock();
    }

    public ObservableCollection<Person> Persons { get; }
        = new ObservableCollection<Person>();

    private void Mock()
    {
        var rnd = new Random();

        for (int i = 0; i < 100; i++)
        {

            Persons.Add(new Person
            {
                Name = $"Child {i}",
                Birthday = RandomBirthDay()
            });
        }

        DataGrid1.ItemsSource = Persons;
    }

    private Random gen = new Random();
    DateTime RandomBirthDay()
    {
        var start = new DateTime(1950, 1, 1);
        int range = (DateTime.Today - start).Days - 20;
        return start.AddDays(gen.Next(range));
    }
}

public class Person
{
    public string Name { get; set; }
    public DateTime Birthday { get; set; }
    public int Age
    {
        get => (new DateTime(1, 1, 1)
            + DateTime.Now.Subtract(Birthday)).Year - 1;
    }
}

2. Страница Xaml:
<Window

    x:Class="DataGridDateColumn.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"



    mc:Ignorable="d"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"



    Title="CodeProject - DataGrid Date Column Examples"

    WindowStartupLocation="CenterScreen" Height="300" Width="600">
    <Grid>
        <DataGrid x:Name="DataGrid1"

                  GridLinesVisibility="None"

                  AlternatingRowBackground="GhostWhite" AlternationCount="1"

                  ScrollViewer.HorizontalScrollBarVisibility="Hidden"

                  AutoGenerateColumns="False"

                  RowDetailsVisibilityMode="VisibleWhenSelected"

                  VirtualizingPanel.ScrollUnit="Pixel">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"

                                    Width="*" />
                <DataGridTextColumn Header="Age" Binding="{Binding Age}"

                                    Width="120"/>
                <DataGridTextColumn Header="Date Text" Width="120"

                                    Binding="{Binding Birthday,
                                              StringFormat=yyyy-MM-dd}" />
                <DataGridTemplateColumn Header="Date Picker" Width="120">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Birthday,
                                                 StringFormat=dd/MM/yyyy}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding Birthday,
                                                          StringFormat=dd/MM/yyyy}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

    </Grid>

</Window>

Если вы хотите изменить формат формата даты редактирования, это немного сложно. Погуглив вокруг, эта ссылка имеет ряд возможных решений: .net-как изменить формат (например, dd/MMM/yyyy) DateTimePicker в приложении WPF-переполнение стека[^]


quator

Мне не удается изменить наклейку формата даты "ДД / МММ / гггг", когда наклейка даты находится в таблице данных.

Graeme_Grant

Работает так, как рекламируется ... добавление образца в решение... Кодовая страница находится на C#, а не на VB - это неважно. Что имеет значение, так это пример XAML.