如何禁用WinForms DataGrid中的按钮单元格?

时间:2008-09-17 18:20:30

标签: c# winforms user-interface

我有一个WinForms应用程序,其中包含DataGridView控件和一列DataGridViewButtonCell单元格。当我点击其中一个按钮时,它会启动一个后台任务,我想在该任务完成之前禁用这些按钮。

我可以禁用DataGridView控件,但它没有显示按钮被禁用的可视指示。我希望用户看到按钮被禁用,并注意到再次启用按钮时任务已完成。

允许我单独禁用按钮的方法的奖励积分,因此我可以在任务运行时启用其中一个按钮。 (请注意,我实际上无法给出奖励积分。)

2 个答案:

答案 0 :(得分:3)

这是迄今为止我发现的最佳解决方案。此MSDN article为添加Enabled属性的单元类提供源代码。

它运作得相当好,但有两个问题:

  1. 在任何单元格上设置Enabled属性后,必须使网格无效。它显示在示例代码中,但我错过了它。
  2. 这只是一个视觉上的变化,设置Enabled属性实际上并不启用或禁用该按钮。用户仍然可以单击它。我可以在执行click事件之前检查enabled属性,但是当用户单击它时,它似乎也会弄乱外观。相反,我只是禁用了整个网格。这对我来说没问题,但我更喜欢一种允许我在不禁用整个网格的情况下禁用某些按钮的方法。
  3. DataGridView FAQ中有类似的示例。

答案 1 :(得分:1)

你可以尝试一下:

单击单元格时...

  1. 检查具有当前行标识符的进程是否正在从类级列表中运行;如果是,请退出单元格单击事件。
  2. 将行标识符存储在正在运行的进程的类级别列表中。
  3. 将按钮文本更改为“正在运行...”或其他适当的内容。
  4. 将基本的RunWorkerCompleted事件处理程序附加到您的进程(稍后解释)。
  5. 调用backgroundWorker.RunWorkerAsync(rowIdentifier)。
  6. 在DoWork事件处理程序中......

    1. 设置e.Result = e.Argument(或创建一个将返回参数和所需结果的对象)
    2. 在RunWorkerCompleted事件hanlder ...

      1. 从正在运行的进程列表中删除行标识符(e.Result是标识符)。
      2. 将按钮文本从“正在运行...”更改为“就绪”