在datagridview列中将值设置为年龄而不是出生日期

时间:2017-06-12 23:21:45

标签: c# winforms datagridview

我在Windows窗体中有一个DataGridview。我有一个字段DOB(出生日期)作为DateTime,我想显示Age而不是显示DOB。 示例:DOB是13.06.2007我想显示10。 我有一个从DOB计算年龄的方法,我怎样才能将它分配给coulmn。 ?

private void bindToGrid(DataTable dtb)
{
   using (dtb)
   {
       dataGridView1.DataSource = dtb;

       dataGridView1.Columns[2].Name = "Age";
       dataGridView1.Columns[2].HeaderText = "Age";
       dataGridView1.Columns[2].DataPropertyName = "DOB";
    }
}

public static string getAge(DateTime dob)
{
    var today = DateTime.Today;
    var age = today.Year - dob.Year;

    if (dob > today.AddYears(-age))
        age--;
    return age.ToString();
}

2 个答案:

答案 0 :(得分:1)

如果DataGridView的{​​{1}}为DataTableDataSource中的“DOB”列的类型为DataTable,那么您将无法将DateTime“年龄”值添加到int的单元格中,因为这会抛出DataGridView,因为单个DataError(年龄)值不在有效的int格式。

由于“年龄”是一个计算值,我们总是可以根据出生日期来计算这个值,然后似乎没有必要经历更改当前DateTime DataTable“DOB”的麻烦“列到”年龄“列。此外,如果更改的表在别处使用并且需要DOB字段,则更改表可能会影响其他代码。因此,有必要将此“年龄”列与dtb分开,只需将此“年龄”列添加到DataTable

为了简单起见,为了让您入门,我建议您暂时将“DOB”列留在DatGridView,并将此“年龄”列添加到{{1} }不是DataTable

假设DataGridView已填充数据DataTable ...下面的方法DataGridView添加“年龄”列,然后循环遍历dataGridView1.DataSource = dtb;行并设置“年龄” “列值使用原始帖子中的AddAgeColumn方法。您可以在网格填充数据后立即调用此方法。

DataGridView

这应该在网格中显示“DOB”列和“Age”列。唯一的问题是,如果用户添加新行或更改“DOB”值,则“年龄”列可能不会反映此更改。要解决这个问题,我们只需要添加一个方法来查找“DOB”值何时更改以及何时更改,只需更新“Age”列。 getAge的{​​{1}}事件将用于指示“DOB”值是否已更改。有线示例如下:

private void AddAgeColumn() {
  try {
    dataGridView1.Columns.Add("Age", "Age");
    DateTime curBD;
    int curAge;
    foreach (DataGridViewRow dgvr in dataGridView1.Rows) {
      if (!dgvr.IsNewRow) {
        curBD = (DateTime)dgvr.Cells["DOB"].Value;
        curAge = getAge(curBD);
        dgvr.Cells["Age"].Value = curAge;
      }
    }
  }
  catch (Exception e) {
    MessageBox.Show("Error: " + e.Message);
  }
}

最后,如果用户在晚上11:59运行程序,并且其中一个“DOB”值是当前日期......那么当时钟到达12:00时,这将会起作用。由于“DOB”值没有改变,AGE不会反映这种变化。您可以考虑一种方法来更新“年龄”值,并在发生这种情况时简单地运行它。希望这是有道理和有帮助的。

答案 1 :(得分:0)

我认为你必须引入一个新的属性:

  1. 向绑定到datagridview表的对象添加一个新属性,称之为“Age”
  2. 通过添加属性[可浏览(false)]使DOB属性不可浏览,因此它不会在视觉上显示在表格中
  3. 在“Age”设置器中输入逻辑,以便在Age值更改时更新DOB值。