0

我的程序分为两部分:

  1. Windows 窗体中的客户端。
  2. 使用 WCF 在远程 Web 服务器 (IIS) 上创建的服务器。

客户端将在同一时间用于我的许多不同用户。

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

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

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

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

谢谢你

4

2 回答 2

1

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

  1. Datagridview 应该只用于阅读。
  2. 编辑行应在 DGV 之外完成。(如果所有对象都不同,那么你会玩得很开心)
  3. 锁定消息应该发送到服务器,服务器会对此进行跟踪。
  4. 锁定的对象应该可以被其他用户读取。不写。
  5. 需要存在锁定对象的超时。

很抱歉把这个丢给你,但你的问题比你想象的要大得多。

于 2012-10-04T20:10:23.277 回答
0

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

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

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

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

同样,这种方法也不是没有问题,但它可能会给你足够的你想要达到的目标。

附录

如果您无法将列添加到正在修改的表中,则可能必须添加存储用户伪锁的全新表。当然,这意味着所有修改表的应用程序都必须配合并且也使用伪锁表。

于 2012-10-04T23:49:15.377 回答