显示Age的DataColumn表达式

时间:2017-06-25 06:27:33

标签: c# .net winforms ado.net

我有一个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;
}

我要添加的表达式列必须返回与此代码相同的结果。

1 个答案:

答案 0 :(得分:0)

我试图在数据级别实现我想要的,但看起来不可能。年龄的计算需要当天。不幸的是,我无法找到一个返回它的函数。

但是我在UI级别使用的方式上做了一些工作,这种方式似乎是最好的方式。我将在Windows Forms项目的示例中进行解释。

首先,我们将创建一个如下所示的数据集

enter image description here

现在我们将创建一个自定义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;
        }



    }


}

这是完整的解决方案

enter image description here

现在在设计器中,我们可以使用DataGridView

可视化我们的数据表

enter image description here

dateOfBirthColumn和ageColumn的DataPropertyName必须设置为&#34; DateOfBirth&#34;。

这是工作Form1的截图(当前日期是2017年6月25日)。

enter image description here