2009-07-28 2 views
2

Est-ce une bonne pratique? J'ai 3 DataGridView et je veux avoir une facilité qui permet à un utilisateur de trier les données en cliquant sur un en-tête de colonne. Je pourrais avoir eu un gestionnaire d'événements pour l'événement ColumnHeaderMouseClick pour chacun de ces DataGridView, mais qu'au contraire je fait un:Est-il prudent d'utiliser le même gestionnaire d'événements pour différents contrôles Windows Forms?

private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     SortDataGridView((sender as DataGridView), e.ColumnIndex); 
    } 

SortDataGridView ressemble à ceci:

/// <summary> 
    /// Sorts a given DataGridView by a column given by its columnIndex. 
    /// Default sort (if it isn't currently sorted) is Ascending. If it's 
    /// already sorted Ascending, change it to Descending. If it is Descending, 
    /// change it to Ascending. 
    /// </summary> 
    /// <param name="dataGridViewToSort">The DataGridViewToSort</param> 
    /// <param name="columnIndexToSortBy">The index of the column which we want to sort by in the DataGridView.</param> 
    private void SortDataGridView(DataGridView dataGridViewToSort, int columnIndexToSortBy) 
    { 
     switch (dataGridViewToSort.SortOrder) 
     { 
      case SortOrder.Ascending: 
       dataGridViewToSort.Sort(dataGridViewToSort.Columns[columnIndexToSortBy], ListSortDirection.Descending); 
       break; 
      case SortOrder.Descending: 
       dataGridViewToSort.Sort(dataGridViewToSort.Columns[columnIndexToSortBy], ListSortDirection.Ascending); 
       break; 
      case SortOrder.None: 
       dataGridViewToSort.Sort(dataGridViewToSort.Columns[columnIndexToSortBy], ListSortDirection.Ascending); 
       break; 
      default: 
       break; 
     } 
    } 

Chaque événement ColumnHeaderMouseClick du DataGridView accroché à ce gestionnaire. Cela implique que pour savoir lequel a soulevé l'événement lors de l'exécution, je dois dire (expéditeur comme DataGridView). Est-ce sûr? L'expéditeur pourrait-il être quelque chose qui n'est pas un DataGridView?

+0

Vous pouvez, mais le paramètre de l'expéditeur est pas vraiment fiable (pas de type sécurité, ...). En outre, utilisez un cast et non un comme parce que vous attendez un DataGridView et rien d'autre. – Guillaume

Répondre

3

Je pense que c'est très acceptable et je l'utilise souvent pour les contrôles qui ont des fonctionnalités similaires. Vous pouvez ajouter une vérification dans l'événement pour vous assurer que l'expéditeur est du type DataGrid si vous pensez que l'expéditeur est un autre objet.

1

Si vous voulez être sûr, vous pouvez toujours vérifier le type de l'expéditeur avant d'essayer de faire quoi que ce soit avec.

En théorie, vous ne devriez pas utiliser le gestionnaire d'autres objets "ColumnHeaderMouseClick" pour cela, cela ne devrait pas être nécessaire.

5

non seulement c'est ok, c'est mieux, car cela rend votre code plus réutilisable, maintenable et extensible.

0

Tant que vous écrivez le gestionnaire pour gérer correctement chaque contrôle ... ce qui est mieux quand la même chose doit être faite sur plusieurs contrôles.

Fondamentalement tant que cela fonctionne, et sera facile à entretenir, vous devriez être bon.

0

C'est bien et sûr. Une petite correction: vous vérifier que l'on a déclenché l'événement par

if (sender == dataGrid1) 

etc. Mais si vous avez des fonctionnalités spécifiques qui, il faut savoir que l'on a déclenché l'événement, alors vous devriez probablement factoriser aux gestionnaires individuels.

0

Cette solution est absolument correcte à mon avis. Vous avez enregistré deux gestionnaires d'événements, qui feraient exactement la même chose. S'il y avait différentes choses à faire dans chacun des gestionnaires, vous n'auriez pas dû le faire de cette façon, mais ici, c'est économiser du temps et du temps.

Dès que l'un des DataGridViews a un travail spécifique à faire sur le gestionnaire d'événements, vous devez lui donner un Event Handler pour lui-même.

2

il est une bonne pratique et suit la SEC (ne vous vous répéter) principe