如何禁用WinForms DataGrid中的按钮单元?
时间:2020-03-05 18:59:36 来源:igfitidea点击:
我有一个带有DataGridView控件的WinForms应用程序,其中包含一列DataGridViewButtonCell单元格。当我单击这些按钮之一时,它将启动一个后台任务,并且我想禁用这些按钮,直到该任务完成。
我可以禁用DataGridView控件,但是它无法直观显示该按钮已被禁用。我希望用户看到按钮被禁用,并注意到当再次启用按钮时任务已完成。
奖励积分是一种允许我单独禁用按钮的方法,因此我可以在任务运行时将其中一个按钮保持启用状态。 (请注意,我实际上无法给出奖励积分。)
解决方案
回答
这是到目前为止我找到的最好的解决方案。此MSDN文章提供了添加Enabled属性的单元格类的源代码。
它工作得相当好,但是有两个陷阱:
- 在任何单元格上设置Enabled属性后,必须使网格无效。它显示在示例代码中,但我错过了。
- 这只是视觉上的更改,设置Enabled属性实际上并不会启用或者禁用按钮。用户仍然可以单击它。我可以在执行click事件之前检查enabled属性,但是当用户单击它时,它似乎也弄乱了外观。相反,我只是禁用了整个网格。这对我来说很好,但是我更喜欢一种方法,该方法允许我禁用某些按钮而不禁用整个网格。
DataGridView FAQ中有一个类似的示例。
回答
我们可以尝试一下:
当我们单击单元格时...
- 检查具有当前行标识符的进程是否正在从类级别列表中运行;如果是这样,请退出单元格单击事件。
- 将行标识符存储在正在运行的进程的类级别列表中。
- 将按钮文本更改为"正在运行..."或者其他适当的方法。
- 将基本的RunWorkerCompleted事件处理程序添加到进程中(稍后说明)。
- 调用backgroundWorker.RunWorkerAsync(rowIdentifier)。
在DoWork事件处理程序中...
- 设置e.Result = e.Argument(或者创建一个将同时返回参数和所需结果的对象)
在RunWorkerCompleted事件处理程序中...
- 从正在运行的进程列表中删除行标识符(例如,结果为标识符)。
- 将按钮文本从"正在运行..."更改为"就绪"