我的程序分为两部分:
客户端将同时用于我的许多不同用户。
我的客户端有很多DataGridView。这些DataGridView绑定到Web服务提供的(不同的)通用对象列表。
我需要经常刷新这些DataGridView的内容。我在客户端上使用一个调用刷新方法的计时器。
但我的问题是:如果我使用Invalidate(),只更新当前显示行的内容;如果另一个用户删除或添加一个新对象(行),当前用户将看不到它。 如果我通过重新绑定数据刷新数据,当前选择就会丢失...想象一下,如果用户正在更新数据,那就是噩梦...(是的,我可以在用户编辑单元格时停止计时器,并在用户完成时重新启动变化,但我希望找到更好的方法!)。
有人看到过这样的问题吗?有人有建议吗?
谢谢
答案 0 :(得分:1)
您所描述的是分布式系统。您需要为此类软件实现锁定和同步。当然你可以把它留下来,但你的结果将是废话。
很抱歉把这个转发给你,但你的问题比你想象的要大。
答案 1 :(得分:0)
同意@ WozzeC的回答。数据库锁定是首选解决方案。
但是如果您不能使用锁定并且不介意访问数据库,则可以通过向要更新的表添加列来模拟锁定,将每行中的列设置为一些唯一的该用户尝试更新/修改该行时的会话ID或用户ID。
这需要在用户选择要修改的行时进行数据库访问,但这具有检查该行仍然存在于数据库中的额外好处(即,它在几秒钟之前未被其他用户删除)。
当然,由于这不是真正的数据库锁定,因此您必须担心终止的用户会话(即,他们的PC崩溃)而不释放他正在修改的行。在表格中添加了“checkout”时间戳列,允许您在一段合理的时间(例如20分钟)后允许用户锁定超时。
同样,这种方法并非没有问题,但它可能会为您提供足够的实现目标。
<强>附录强>
如果无法向要修改的表添加列,则可能必须添加存储用户伪锁的全新表。当然,这意味着修改表的所有应用程序必须合作并使用伪锁表。