代码之家  ›  专栏  ›  技术社区  ›  Don Kirkby

如何禁用WinForms数据报中的按钮单元格?

  •  2
  • Don Kirkby  · 技术社区  · 16 年前

    我有一个WinForms应用程序,其中包含一个DataGridView控件和一列DataGridViewButtonCell单元格。当我单击其中一个按钮时,它将启动一个后台任务,我希望禁用这些按钮,直到该任务完成。

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

    一种方法的奖励点数,它允许我单独禁用按钮,这样我可以在任务运行时保持其中一个按钮处于启用状态。(请注意,我实际上不能给出加分。)

    2 回复  |  直到 16 年前
        1
  •  3
  •   Don Kirkby    13 年前

    这是迄今为止我找到的最佳解决方案。这个 MSDN article 为添加已启用属性的单元类提供源代码。

    它工作得相当好,但有两个目标:

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

    有一个相似的样本在 DataGridView FAQ .

        2
  •  1
  •   Austin Salonen gmlacrosse    16 年前

    您可以尝试一下:

    单击单元格时…

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

    在DoWork事件处理程序中…

    1. 设置e.result=e.argument(或创建一个同时返回参数和所需结果的对象)

    在RunWorkerCompleted事件Hanlder中…

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