我有一个DataTable,其中包含DateTime类型的“DateOfBirth”列。 我需要在表中添加额外的EXPRESSION COLUMN来计算Age。
我搜索了正确的DateTime函数,却找不到任何函数。
我已经在UI级别解决了问题(通过添加DataGridViewColumn和处理dgv事件),但我不喜欢它。最好的方法是通过ExpressionColumn在DataTable级别执行此操作。
有人可以帮忙吗?
我正在使用以下代码来计算年龄
public static int GetAge(DateTime dateOfBirth)
{
int age = DateTime.Today.Year - dateOfBirth.Year;
int dm = DateTime.Today.Month - dateOfBirth.Month;
int dd = DateTime.Today.Day - dateOfBirth.Day;
if (age > 0)
{
if (dm < 0)
{
age--;
}
else if (dm == 0)
{
if (dd < 0)
{
age--;
}
}
}
return age;
}
我要添加的表达式列必须返回与此代码相同的结果。
答案 0 :(得分:0)
我试图在数据级别实现我想要的,但看起来不可能。年龄的计算需要当天。不幸的是,我无法找到一个返回它的函数。
但是我在UI级别使用的方式上做了一些工作,这种方式似乎是最好的方式。我将在Windows Forms项目的示例中进行解释。
首先,我们将创建一个如下所示的数据集
现在我们将创建一个自定义DataGridView列,该列将根据&#34; DateOfBirth&#34;显示年龄。 &#34;人物#34;数据表。这是代码
DataGridViewAgeColumn.cs
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public class DataGridViewAgeColumn : DataGridViewTextBoxColumn
{
public DataGridViewAgeColumn()
{
CellTemplate = new DataGridViewAgeColumnCell();
}
}
}
DataGridViewAgeColumnCell.cs
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public class DataGridViewAgeColumnCell : DataGridViewTextBoxCell
{
protected override bool SetValue(int rowIndex, object value)
{
return false;
}
protected override object GetValue(int rowIndex)
{
var value = base.GetValue(rowIndex);
if (value is DateTime)
{
DateTime dateOfBirth = (DateTime)value;
return GetAge(dateOfBirth);
}
else
{
return null;
}
}
static int GetAge(DateTime dateOfBirth)
{
int age = DateTime.Today.Year - dateOfBirth.Year;
int dm = DateTime.Today.Month - dateOfBirth.Month;
int dd = DateTime.Today.Day - dateOfBirth.Day;
if (age > 0)
{
if (dm < 0)
{
age--;
}
else if (dm == 0)
{
if (dd < 0)
{
age--;
}
}
}
return age;
}
}
}
这是完整的解决方案
现在在设计器中,我们可以使用DataGridView
可视化我们的数据表dateOfBirthColumn和ageColumn的DataPropertyName必须设置为&#34; DateOfBirth&#34;。
这是工作Form1的截图(当前日期是2017年6月25日)。