Формат даты в столбце DataGridView в произвольном формате - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть DataGridView , где пользователь вставляет данные о различных продуктах.Один из столбцов содержит данные о дате истечения срока действия элемента.Мне сказали, чтобы пользователю было проще и быстрее набирать эту дату, поэтому мне нужно сделать формат даты примерно таким: "ddMMyy" (без разделителей точки или косой черты между днем, месяцем игод, всего 2 цифры года).DataGrid привязан к моей базе данных , поэтому я предполагаю, что мне следует преобразовать введенные пользователем данные в принятый формат базы данных ("dd.MM.yyyy") до того, как будет выполнено обновление базы данных.

Однако я попытался выполнить это обновление в событии CellLeave , так как это первое событие, которое вызывается, когда пользователь покидает ячейку.Это не сработало, пробовал в CellEndEdit , CellValidating и CellValidate , но все равно безуспешно (обновление в DataTable выполняется в CellValidate событие).Я попробовал следующий код, но на точке останова кажется, что я форматирую не фактический текст в DataGrid, а старое значение, которое уже находится в базе данных:

If dgv.CurrentCell.ColumnIndex = dgv.Columns("Expiry_Date").Index Then
        Dim strData As String = dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString()
        Dim day As String = strData.Substring(0, 2)
        Dim month As String = strData.Substring(2, 2)
        Dim year As String = strData.Substring(4, 2)
        strData = day & "." & month & "." & year
        Dim d As Date = Date.Parse(strData)
        dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = d
End If

Значение, вставленное в ячейку DataGridViewбыл «160420», который должен был быть отформатирован как «16.04.2020», но strData показывал «20.09.2021», то есть старое значение, которое было в базе данных до редактирования.

Я знаю, что могу упустить что-то, что на самом деле довольно легко, но до сих пор мне не удалось решить это.Несмотря на то, что я предоставил код VB.NET, любая справка по C # также приветствуется, так как я могу легко конвертировать между ними.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Кажется, это работает:

Imports System.Globalization

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim table As New DataTable

        With table.Columns
            .Add("ID", GetType(Integer)).AutoIncrement = True
            .Add("Name", GetType(String))
            .Add("Date", GetType(Date)).AllowDBNull = True
        End With

        With table.Rows
            .Add(1, "Peter", #1/1/2000#)
            .Add(2, "Paul", #6/19/1969#)
            .Add(3, "Peter", Date.Today)
        End With

        DataGridView1.DataSource = table

        'Use the display format by default.
        DataGridView1.Columns(2).DefaultCellStyle.Format = "dd.MM.yyyy"
    End Sub

    Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        If DataGridView1.CurrentCellAddress.X = 2 Then
            'Display the date in the editing format.
            Dim cellValue = DataGridView1.CurrentCell.Value
            Dim text = If(cellValue Is DBNull.Value, String.Empty, CDate(cellValue).ToString("ddMMyy"))

            e.Control.Text = text
        End If
    End Sub

    Private Sub DataGridView1_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
        If e.ColumnIndex = 2 AndAlso
           DataGridView1.EditingControl IsNot Nothing AndAlso
           Not e.FormattedValue.Equals(String.Empty) Then
            Dim value As Date

            'Validate the input using the editing format and the display format.
            e.Cancel = Not Date.TryParseExact(CStr(e.FormattedValue),
                                              {"ddMMyy", "dd.MM.yyyy"},
                                              Nothing,
                                              DateTimeStyles.None,
                                              value)

            If Not e.Cancel Then
                'Ensure data is displayed using the display format.
                DataGridView1.EditingControl.Text = value.ToString("dd.MM.yyyy")
            End If
        End If
    End Sub

End Class

Когда начинается сеанс редактирования, текст в элементе управления редактированием явно форматируется как «ddMMyy», и, если вход проходит проверку, текст преобразуется обратно вформат "dd.MM.yyyy", чтобы сетка автоматически анализировала его как Date.

0 голосов
/ 20 сентября 2018

использовать обработчик событий CellFormatting

private void DataGridView1_CellFormatting(object sender,
    DataGridViewCellFormattingEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    if (dgv.Columns[e.ColumnIndex].Name == "Columnname" &&
        e.RowIndex >= 0 &&
        dgv["Columnname", e.RowIndex].Value is int)
    {
        switch ((int)dgv["TargetColumnName", e.RowIndex].Value)
        {

                //Create custom display text/value here and assign to e.Value
                string dataformatValue = //Create from database value;
                e.Value = dataformatValue ;
                e.FormattingApplied = true;

        }
    }
}

Вам просто нужно создать настраиваемое отображаемое значение и разрешить сетке, в которой применяется настраиваемое форматирование, или нет.

...