【问题标题】:Running Timer in DataGridView在 DataGridView 中运行计时器
【发布时间】:2014-05-25 23:42:51
【问题描述】:

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

由于我已经查询了“开始日期时间”,因此应该有一种方法可以通过计时器简单地增加“持续时间”字段,而无需在网络上一遍又一遍地移动所有不必要的数据。

有没有办法在将 DataSource 链接到其他列的数据库时以编程方式处理单个列?


更新 [5/28/14 下午 5:23 CT]:

如果有帮助,这里是绑定数据源的代码(“持续时间”未绑定):

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;
    }
}

【问题讨论】:

  • 是的,您可以将未绑定的列添加到数据绑定DataGridViews:msdn.microsoft.com/en-us/library/zkatshfa%28v=vs.90%29.aspx
  • @adv12 啊,有道理。但是如何在网格不重新填充其他列的情况下更新“持续时间”列?现在它正在刷新所有内容并导致选择重复移动到 0 索引行。

标签: c# sql .net linq datagridview


【解决方案1】:

添加一个计时器duractionTimer,间隔=1000。

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
}

注意:这假设 Duration 列仍然绑定。如果你解绑了它,你可以直接通过 DGV-Rows-Cells 而不需要访问结果集的特殊魔法。

【讨论】:

  • 非常感谢您的回答。我认为它会解决我的问题,但我无法检索 DGV 的 DataTable。此外,它似乎想要“DataGridViewRow”而不是“DataRow”。我尝试了许多变体,但继续收到与无效转换相关的运行时错误。用我的代码更新了问题。有什么想法吗?
  • 您需要更改DataTable中的值;如果incidentList 是DataGridView,那么DataTable 应该是incidentList.DataSource.Tables[0]。如果您对此有疑问,请尝试在 DGV 已填充且在范围内的行处停止调试器并查看它;钻进去,你应该可以看到它的DataSource 和它的DataTable..
  • 我错了——你不会在DataSource 中找到DataTable,你甚至不会在DataSource 中找到DataSet,只是作为IQueryable 列表的tablerows .查看我编辑的答案!
猜你喜欢
  • 2018-10-05
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多