替换DataGridView中的DateTime.MinValue

时间:2009-02-20 06:11:33

标签: c# datetime sqlite datagridview

我正在处理名称记录应用程序,并且信息存储在SQLite数据库中。数据库中的所有列都是TEXT类型,除了出生日期列,这是DATETIME。我转移到SQLite数据库的原始Access数据库允许出生日期为空,所以当我复制它时,我将所有空值设置为DateTime.MinValue。

在我的申请中,出生日期栏的格式如下:

DataGridViewTextBoxColumn dateOfBirth = new DataGridViewTextBoxColumn();
        dateOfBirth.HeaderText = "DOB";
        dateOfBirth.DataPropertyName = "DateOfBirth";
        dateOfBirth.Width = 75;
        dateOfBirth.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        dateOfBirth.DefaultCellStyle.Format = "MM/dd/yyyy";

我的问题是没有出生日期的行,数据库有DateTime.MinValue,它在我的DataGridView中显示为01/01/0001。

我正在寻找一种在我的DataGridView中用空字符串(“”)替换01/01/0001的方法。

private void resultsGrid_DateFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
    {
        if(resultsGrid.Columns[e.ColumnIndex].Name.Equals("DateOfBirth"))
        {
            if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue)
            {
                 // Set cell value to ""
            }
        }
    }

任何人都知道我如何用空字符串替换DataGridView中的DateTime.MinValue?谢谢!

编辑:使用DateTime转换单元格值允许我必须使用if语句,但我仍然无法找出用空字符串替换MinValues的编码。

8 个答案:

答案 0 :(得分:5)

您只需将其强制转换为DateTime

即可
if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue)
            {
                 // Set cell value to ""
            }

答案 1 :(得分:4)

我发现DateTime.MinValue显示的原因!

单元格格式部分中的这一行导致显示“01/01/0001”的MinValue:

dateOfBirth.DefaultCellStyle.Format = "MM/dd/yyyy";

如果没有此行,我的datagridview中的出生日期字段将留空。

Barbaros Alp对于我当时尝试做的事情仍然是正确的。谢谢大家!

答案 2 :(得分:2)

虽然实现所需的转换可能非常简单(请参阅我之前的优秀答案),但我觉得理想情况下应该使用NULL替换数据库中此特定列中的所有DateTime.MinValue值。这将正确地表示此职位中实际缺乏数据。目前,您的数据库包含不正确的数据,您正在尝试对数据进行后处理以供显示。

因此,您可以使用EmptyDataTextNullDisplayText属性处理GridView中的数据显示,以提供适当的渲染。

答案 3 :(得分:2)

使用可空的DateTime格式而不是DateTime(“DateTime?”) - 不要使用字符串。

示例:

public DateTime? mydate;

然后:

DGview.Rows.Add(mydate.HasValue ? mydate : null);

答案 4 :(得分:0)

if (yourDateOfBirth != null)
{
    Convert.ToDate(yourDateOfBirth) == DateTime.MinValue
}

答案 5 :(得分:0)

您可以将对象强制转换为DateTime对象:

//create a nullable intermediate variable
System.DateTime? dtCellValue = resultsGrid.CurrentRow.Cells["DateOfBirth"].Value as System.DateTime?;

//if this cell has been set to String.Emtpy the cast will fail
//so ensure the intermediate variable isn't null
if ( dtCellValue.HasValue && dtCellValue == System.DateTime.MinValue )
//set cell value appropriately

答案 6 :(得分:0)

private void resultsGrid_DateFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
{
    if(resultsGrid.Columns[e.ColumnIndex].Name.Equals("DateOfBirth"))
{
    if ((string)resultsGrid.CurrentRow.Cells["DateOfBirth"].Value == DateTime.MinValue.ToString())
    {
         // Set cell value to ""
    }
}

}

或者您可能需要转换为DateTime然后与MinValue进行比较,但听起来您的想法是正确的。

答案 7 :(得分:0)

已经有答案应该达到你想要的效果;但我想知道为什么你不在数据库中加入NULL开始?在sqlite3中,“datetime”或多或少只是一个字符串,(日期时间列没有什么特别之处,因为sqlite3只是类型afinity,而不是类型绑定),所以你只需在该列中插入NULL。如果您想在查询时获得日期时间的MinValue,则可以轻松执行类似

的查询
select coalesce(your_datetime_column,'01/01/0001') from your_table