【问题标题】:DataGridView C# Edit Mode Value Formatting After Edit编辑后DataGridView C#编辑模式值格式
【发布时间】:2012-04-05 09:40:57
【问题描述】:

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

【问题讨论】:

    标签: c# winforms events datagridview event-handling


    【解决方案1】:

    最简单的方法是返回 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; 
    } 
    

    【讨论】:

    • 我遇到的相关问题是,当我输入新的时间值时,TimeColumns 默认为当前日期,即使它们被称为“时间列”,可见的只是时间部分DateTime,用户可以编辑的只有时间部分。这是一个务实的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多