更新DataGridView而不会丢失当前单元格焦点

时间:2012-10-04 19:42:43

标签: c# .net winforms wcf

我的程序分为两部分:

  1. Windows窗体中的客户端。
  2. 在远程Web服务器(IIS)上使用WCF制作的服务器。
  3. 客户端将同时用于我的许多不同用户。

    我的客户端有很多DataGridView。这些DataGridView绑定到Web服务提供的(不同的)通用对象列表。

    我需要经常刷新这些DataGridView的内容。我在客户端上使用一个调用刷新方法的计时器。

    但我的问题是:如果我使用Invalidate(),只更新当前显示行的内容;如果另一个用户删除或添加一个新对象(行),当前用户将看不到它。 如果我通过重新绑定数据刷新数据,当前选择就会丢失...想象一下,如果用户正在更新数据,那就是噩梦...(是的,我可以在用户编辑单元格时停止计时器,并在用户完成时重新启动变化,但我希望找到更好的方法!)。

    有人看到过这样的问题吗?有人有建议吗?

    谢谢

2 个答案:

答案 0 :(得分:1)

您所描述的是分布式系统。您需要为此类软件实现锁定和同步。当然你可以把它留下来,但你的结果将是废话。

  1. Datagridview应该只供阅读。
  2. 编辑行应在DGV外部完成。 (如果所有对象都不同,那么你将获得乐趣)
  3. 应将锁定消息发送到服务器,服务器会跟踪此消息。
  4. 应该可以为其他用户阅读锁定的对象。不写。
  5. 锁定对象的Timouts需要存在。
  6. 很抱歉把这个转发给你,但你的问题比你想象的要大。

答案 1 :(得分:0)

同意@ WozzeC的回答。数据库锁定是首选解决方案。

但是如果您不能使用锁定并且不介意访问数据库,则可以通过向要更新的表添加列来模拟锁定,将每行中的列设置为一些唯一的该用户尝试更新/修改该行时的会话ID或用户ID。

这需要在用户选择要修改的行时进行数据库访问,但这具有检查该行仍然存在于数据库中的额外好处(即,它在几秒钟之前未被其他用户删除)。

当然,由于这不是真正的数据库锁定,因此您必须担心终止的用户会话(即,他们的PC崩溃)而不释放他正在修改的行。在表格中添加了“checkout”时间戳列,允许您在一段合理的时间(例如20分钟)后允许用户锁定超时。

同样,这种方法并非没有问题,但它可能会为您提供足够的实现目标。

<强>附录

如果无法向要修改的表添加列,则可能必须添加存储用户伪锁的全新表。当然,这意味着修改表的所有应用程序必须合作并使用伪锁表。