【问题标题】:Update a DataGridView without loosing current cell focus在不丢失当前单元格焦点的情况下更新 DataGridView
【发布时间】:2012-10-04 19:42:43
【问题描述】:

我的程序分为两部分:

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: c# .net winforms wcf


    【解决方案1】:

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

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

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

    【讨论】:

    • 我知道你在说什么。锁定不是一种选择。其他工具也在与数据库进行实时交互。别担心:如果我可以使用锁定,我会使用它。你必须知道我们正在使用的当前工具(在 FoxPro 中)已经实时更新:我不能使用锁定并且必须快速刷新数据。
    【解决方案2】:

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

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

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

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

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

    附录

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

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2013-03-17
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多