在DataGridView列中以自定义格式设置日期格式

时间:2018-09-20 07:45:23

标签: c# vb.net datagridview date-format database-update

我有一个 DataGridView ,用户可以在其中插入有关不同产品的数据。列之一保存该项目过期日期的数据。我被告知要使用户键入此日期变得容易快捷,因此我必须使日期格式如下:“ ddMMyy” (在日,月之间没有点或斜杠分隔符和年份,只有2位数字的年份)。 DataGrid已绑定到我的 DataBase ,所以我想我应该在对数据库进行更新之前将用户输入转换为数据库的可接受格式(“ 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 :(得分:2)

这似乎可行:

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

答案 1 :(得分:1)

使用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;

        }
    }
}

您只需要创建自定义显示值,并让是否应用自定义格式的网格即可。