我在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();
}
答案 0 :(得分:1)
如果DataGridView
的{{1}}为DataTable
,DataSource
中的“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)
我认为你必须引入一个新的属性: