2008-09-17 61 views
2

我有一个DataGridView控件和一列DataGridViewButtonCell单元格的WinForms应用程序。当我点击其中一个按钮时,它会启动一个后台任务,并且我希望禁用这些按钮,直到该任务完成。如何禁用WinForms DataGrid中的按钮单元格?

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

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

回答

3

这是迄今为止我找到的最佳解决方案。这MSDN article给出了添加Enabled属性的单元类的源代码。

它的工作原理相当不错,但有两个陷阱:

  1. 你必须设置任何细胞Enabled属性后,电网失效。它显示在示例代码中,但我错过了它。
  2. 这只是一个视觉上的改变,设置Enabled属性实际上并不启用或禁用按钮。用户仍然可以点击它。我可以在执行click事件之前检查启用的属性,但当用户点击它时,它似乎也弄乱了外观。相反,我只是禁用了整个电网。这对我来说很好,但我更喜欢一种方法,允许禁用某些按钮而不禁用整个网格。

DataGridView FAQ中有类似的样本。

1

你可以试试这个:

当您单击单元格...

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

在DoWork的事件处理程序...

  1. 设置e.Result = e.Argument(或创建一个对象,将返回两个参数,你想要的结果)

在RunWorkerCompleted event hanlder ...

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

感谢您提供了一个有趣的替代方案,但我宁愿坚持使用灰色按钮的标准视觉提示。 – 2008-09-17 18:57:34

相关问题