我正在使用LINQ将对象从SQL数据库填充到DataGridView中。我有一个列需要有一个不断运行的秒表来显示自添加条目以来的时间,但是,许多客户端将从这个数据库中提取,我宁愿不经常查询数据库只是为了检索我已经可以的值计算。例如,这就是DGV的样子:
由于我已经查询过“Start DateTime”,因此应该有一种方法可以通过计时器简单地增加“持续时间”字段,而不必一遍又一遍地在网络上移动所有不必要的数据。
有没有办法以编程方式处理单个列,同时将DataSource链接到其他列的数据库?
更新[2014年5月28日下午5:23 CT]:
如果有帮助,这里是绑定DataSource的代码(“Duration”是未绑定的):
private void IncidentsModule_Load(object sender, EventArgs e)
{
incidentList.DataSource = model.GetOngoingIncidents().Select(i => new {
Name = i.Name,
SHDTicket = i.SHDTicket,
StartDateTime = i.StartDateTime
}).ToList();
}
以下是基于 TaW 输入的计时器的当前代码:
private void incidentDurationTimer_Tick(object sender, EventArgs e)
{
foreach (DataRow dr in incidentList.Rows)
{
dr[IncidentDurationColumn.Index] = DateTime.Now.Second;
}
}
答案 0 :(得分:0)
添加Interval = 1000的计时器duractionTimer
。
让dataTable
成为DataGridView绑定的表。
让durationcolumnIndex
成为持续时间列的索引
将DateTime.Now.Second
替换为您为每行计算的值!
private void duractionTimer_Tick(object sender, EventArgs e)
{
foreach (DataRow dr in dataTable.Rows)
{
dr[durationcolumnIndex] = DateTime.Now.Second;
}
}
这将自动设置列,即使它已绑定。确保
修改:
当我写下答案时,我没有意识到LINQ没有返回常规的ADO DataSet / DataTable。相反,DataSource将包含IQueryable<Table>
。
假设表LINQ访问名为 IncidentTable 您可以访问timer_Tick
事件中每行的 Duration 列:
foreach (var vv in incidentList.DataSource as IQueryable<IncidentTable>)
{
vv.Duration = // your computed value here
}
注意:这假定持续时间列仍然绑定。如果你没有绑定它,你可以直接通过DGV-Rows-Cells,而无需访问结果集的特殊魔法。