DataGridView C#编辑后编辑模式值格式

时间:2012-03-20 21:08:39

标签: c# winforms events datagridview event-handling

我在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事件是实际可以获取新单元格值的唯一事件,但是,当我在事件处理程序中更改值时,它会被无限循环捕获。

1 个答案:

答案 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; 
}