繁体   English   中英

在不失去当前单元格焦点的情况下更新DataGridView

[英]Update a DataGridView without loosing current cell focus

我的程序分为两部分:

  1. Windows窗体中的客户端。
  2. 由WCF制成的服务器,位于远程Web服务器(IIS)上。

我的许多不同用户将同时使用该客户端。

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

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

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

有人看到过类似的问题吗? 有人有建议吗?

谢谢

您所描述的是一个分布式系统。 您需要为此类软件实现锁定和同步。 当然,您可以忽略它,但结果将是胡扯。

  1. Datagridview应该只在这里阅读。
  2. 编辑行应在DGV之外进行。 (如果所有对象都不同,那么您将很有趣)
  3. 锁定消息应发送到服务器,服务器对此进行跟踪。
  4. 锁定的对象应该可以为其他用户读取。 不写。
  5. 锁定对象的超时值必须存在。

抱歉,将其转交给您,但您的问题比您想象的要大得多。

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

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

这要求在用户选择要修改的行时进行数据库访问,但这具有检查行是否仍存在于数据库中的附加好处(即,几秒钟前没有被其他用户删除该行)。

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

同样,这种方法并非没有问题,但是可以为您提供您想要实现的目标。

附录

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM