在DataGridView中运行Timer

时间:2014-05-25 23:42:52

标签: c# sql .net linq datagridview

我正在使用LINQ将对象从SQL数据库填充到DataGridView中。我有一个列需要有一个不断运行的秒表来显示自添加条目以来的时间,但是,许多客户端将从这个数据库中提取,我宁愿不经常查询数据库只是为了检索我已经可以的值计算。例如,这就是DGV的样子:

enter image description here

由于我已经查询过“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;
    }
}

1 个答案:

答案 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,而无需访问结果集的特殊魔法。