我在C#Winform项目中有一个datagridview。此datagridview用于将值插入数据库。每列匹配相应的db列。
其中一列是DateTime列。我想'验证'这个日期,以确保它的格式正确。理想情况下,您将离开单元格,它会将其转换为我选择的日期时间格式。
我使用了一系列事件来尝试创建此功能,但一直遇到问题。我一直遇到的问题是,当事件触发时,该值尚未存储在单元格中。因此,当我做这样的事情时,例如:
private void Grid_Modify_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (Grid_Modify.Columns[e.ColumnIndex].Name == "DateTime")
{
Grid_Modify[e.ColumnIndex, e.RowIndex].Value =
Convert.ToDateTime(Grid_Modify[e.ColumnIndex, e.RowIndex].Value).ToString("YYYY-MM-DD hh:mm:ss");
}
}
问题是,它转换为日期时间的值是原始单元格值 - 而不是我刚输入的新值。我假设这是因为事件在更新单元格值之前触发。
问题是:更改其值时格式化日期的最佳方法是什么?
我尝试过的其他事件有:CellLeave,CellValueChanged,CellValidated和CellEndEdit。
注意:CellValueChanged事件是实际可以获取新单元格值的唯一事件,但是,当我在事件处理程序中更改值时,它会被无限循环捕获。
答案 0 :(得分:4)
最简单的方法是返回CellValueChanged事件处理程序并使用全局变量来避免无限循环:
private bool _inCellValueChanged = false;
然后,在CellValueChanged中:
if (!_inCellValueChanged && Grid_Modify.Columns[e.ColumnIndex].Name == "DateTime")
{
_inCellValueChanged = true;
Grid_Modify[e.ColumnIndex, e.RowIndex].Value = Convert.ToDateTime(Grid_Modify[e.ColumnIndex, e.RowIndex].Value).ToString("YYYY-MM-DD hh:mm:ss");
_inCellValueChanged = false;
}