2008-09-17 10 views
2

J'ai une application WinForms avec un contrôle DataGridView et une colonne de cellules DataGridViewButtonCell à l'intérieur. Lorsque je clique sur l'un de ces boutons, il démarre une tâche en arrière-plan et j'aimerais désactiver les boutons jusqu'à ce que cette tâche soit terminée.Comment désactiver une cellule de bouton dans un DataGrid WinForms?

Je peux désactiver le contrôle DataGridView, mais cela ne donne aucune indication visuelle que les boutons sont désactivés. Je veux que l'utilisateur voit que les boutons sont désactivés et que la tâche soit terminée lorsque les boutons sont à nouveau activés.

Points bonus pour une méthode qui me permet de désactiver les boutons individuellement, afin que je puisse laisser l'un des boutons activé pendant que la tâche s'exécute. (Notez que je ne peux pas vraiment donner de points bonus.)

Répondre

3

Voici la meilleure solution que j'ai trouvée jusqu'ici. Ce MSDN article donne le code source d'une classe de cellule qui ajoute une propriété Enabled.

Il fonctionne assez bien, mais il y a deux: gotchas

  1. Vous devez invalider la grille après avoir défini la propriété Activé sur toutes les cellules. Il montre cela dans l'exemple de code, mais je l'ai manqué.
  2. Il s'agit uniquement d'un changement visuel, la définition de la propriété Enabled n'active ni ne désactive réellement le bouton. L'utilisateur peut toujours cliquer dessus. Je pouvais vérifier la propriété enabled avant d'exécuter l'événement click, mais il semblait également gâcher l'apparence lorsque l'utilisateur cliquait dessus. Au lieu de cela, je viens de désactiver toute la grille. Cela fonctionne bien pour moi, mais je préfère une méthode qui me permet de désactiver certains boutons sans désactiver toute la grille.

Il existe un exemple similaire dans DataGridView FAQ.

1

Vous pouvez donner à ce essayer:

Lorsque vous cliquez sur la cellule ...

  1. Vérifiez si le processus avec l'identifiant courant de ligne est en cours d'exécution à partir d'une liste au niveau de la classe; Si c'est le cas, quittez l'événement de clic de cellule.
  2. Stockez l'identificateur de ligne dans la liste des processus en cours au niveau de la classe.
  3. Changez le texte du bouton en "Running ..." ou quelque chose de approprié.
  4. Attachez un gestionnaire d'événement RunWorkerCompleted de base à votre processus (expliqué brièvement).
  5. Appelez backgroundWorker.RunWorkerAsync (rowIdentifier).

Dans le gestionnaire d'événements DoWork ...

  1. Set e.Result = e.Argument (ou créer un objet qui retournera à la fois l'argument et le résultat souhaité)

Dans l'événement RunWorkerCompleted hanlder ...

  1. Supprimez l'identificateur de ligne de la liste des processus en cours d'exécution (e.Result est l'identificateur).
  2. Modifier le texte du bouton "Exécution ...""à" Prêt "
+1

Merci pour une alternative intéressante, mais je préfère rester avec la queue visuelle standard de grisonner les boutons. –