Формат даты в столбце DataGridView в произвольном формате
У меня есть DataGridView, где пользователь вставляет данные о разных продуктах. В одном из столбцов хранятся данные о дате истечения срока действия элемента. Мне сказали, чтобы пользователю было проще и быстрее набирать эту дату, поэтому я должен сделать формат даты примерно таким: "ddMMyy" (без разделителей точки или косой черты между днем, месяцем и годом, только с двумя цифрами). год). 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 ответа
Это похоже на работу:
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
,
Использовать обработчик событий 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;
}
}
}
Вам просто нужно создать собственное отображаемое значение и позволить сетке, что пользовательское форматирование применяется или нет.