我正在处理名称记录应用程序,并且信息存储在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的编码。
答案 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值。这将正确地表示此职位中实际缺乏数据。目前,您的数据库包含不正确的数据,您正在尝试对数据进行后处理以供显示。
因此,您可以使用EmptyDataText
或NullDisplayText
属性处理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