数据网格中的实时数据,用于数据库中新添加或删除的行

时间:2011-06-03 21:51:24

标签: c# .net wpf ado.net binding

    public void RefreshEntities(object sender)
    {
        for (; ; )
        {
            try
            {
                //refreshing entities will not add new rows added so datagrid needs to be recreated
                if (isChanged())
                {
                    Fetch(); //Reset binding or reconstruct data grid
                    networkEntityTracker = pLCSignilinxEntities.SIGNILINX_NETWORK.ToList().Count;
                    systemEntityTracker = pLCSignilinxEntities.SIGNILINX_SYSTEM.ToList().Count;
                    tagEntityTracker = pLCSignilinxEntities.SIGNILINX_TAG.ToList().Count;
                }
                pLCSignilinxEntities.Refresh(System.Data.Objects.RefreshMode.StoreWins, pLCSignilinxEntities.SIGNILINX_NETWORK);
                pLCSignilinxEntities.Refresh(System.Data.Objects.RefreshMode.StoreWins, pLCSignilinxEntities.SIGNILINX_SYSTEM);
                pLCSignilinxEntities.Refresh(System.Data.Objects.RefreshMode.StoreWins, pLCSignilinxEntities.SIGNILINX_TAG);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Unable to refresh.");
            }
            Thread.Sleep(300);
        }
    }

我有一个从数据源拖动的数据网格。 datagrid对应于从SQL数据库创建的实体数据模型的表。数据库中的表定期更改。所以我的程序的目标是在datagrid上显示实时数据。我的程序正在很好地显示除新行或删除行之外的实时数据。当在SQL数据库中的表中插入新行或删除删除行时,数据网格不会更新该行。

上述功能是刷新数据网格的功能。我想我必须编写Fetch()函数来重置绑定或重构数据网格,以便为新添加的行或删除的行更新数据网格。

然后这个函数被后台线程调用为委托,这样数据网格每300毫秒刷新一次。

1 个答案:

答案 0 :(得分:0)

首先,更好的方法是Threading.Timer而不是睡眠的无限循环。

http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

或者,如果您有权访问,则可以设置Sql依赖关系,以便在每次更新,添加或删除数据时触发更改事件。虽然对我来说这从来没有奏效过,但最终我只是自己动手了。但是这里有一些关于sql依赖的东西

http://www.dreamincode.net/forums/topic/156991-using-sqldependency-to-monitor-sql-database-changes/

然后,您只需确保不在内存中缓存任何内容,并且每次都从数据库表重新加载数据。如果您不想拉出整个表(这可能需要一段时间,具体取决于大小),您可以随时设置某种更改表,以跟踪自上次检查后自上次更新,添加或删除的记录。然后只需提取这些记录的数据或从内存中删除已删除的记录。

希望这对你有所帮助。