ImG*_*reg 0 c# events datagridview event-handling winforms
我在 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");
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,它转换为日期时间的值是原始单元格值——而不是我刚刚输入的新值。我认为这是因为在更新单元格值之前触发了事件。
问题是:当我更改日期的值时,格式化日期的最佳方式是什么?
我尝试过的其他事件是:CellLeave、CellValueChanged、CellValidated 和 CellEndEdit。
注意: CellValueChanged 事件是唯一可以实际获取新单元格值的事件,但是,当我更改事件处理程序中的值时,它会陷入无限循环。
最简单的方法是返回 CellValueChanged 事件处理程序并使用全局变量来避免无限循环:
private bool _inCellValueChanged = false;
Run Code Online (Sandbox Code Playgroud)
然后,在 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;
}
Run Code Online (Sandbox Code Playgroud)