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

问题描述:

我在C#Winform项目中有一个datagridview。这个datagridview用于将值插入到数据库中。每个列匹配一个相应的数据库列。DataGridView C#编辑模式值编辑后的格式

其中一列是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"); 
    } 
} 

问题是,它被转换为datetime值是原来的单元格的值 - 不是我刚刚进入新的价值。我认为这是因为事件在单元格值更新之前触发。

问题是:当我更改其值时,格式化日期的最佳方法是什么?

我尝试过的其他事件是:CellLeave,CellValueChanged,CellValidated和CellEndEdit。

注意:CellValueChanged事件是实际上可以获取新单元格值的唯一事件,但是,当我更改事件处理程序中的值时,它会陷入无限循环中。

最简单的将是回到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; 
} 
+0

我怕我会必须去那样的东西.. – ImGreg 2012-03-21 00:03:54

+0

我有相关的问题是,当我输入一个新的时间值时,即使他们被称为“时间列”TimeColumns默认为当前日期,所有可见的是时间DateTime的一部分,以及所有用户可以编辑的是时间部分。这是一个务实的解决方案。 – mickeyf 2016-11-08 22:33:56