以自定义格式格式化 DataGridView 列中的日期
Format date in DataGridView column in custom format
我有一个 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# 帮助,因为我可以轻松地在这两者之间进行转换。
使用 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;
}
}
}
您只需要创建自定义显示值并设置是否应用自定义格式的网格。
这似乎有效:
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
.
我有一个 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# 帮助,因为我可以轻松地在这两者之间进行转换。
使用 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;
}
}
}
您只需要创建自定义显示值并设置是否应用自定义格式的网格。
这似乎有效:
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
.