Tester un événement

[Résolu]
Signaler
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008
-
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008
-
Bonjour,

Est il possible de savoir si un événement a été déclencher. Je voudrais tester l'événement RowsRemoved d'un datagridview.
Autre question, comment faire pour savoir si un ligne a été supprimer dans un datagridview ?

Merci à tous

13 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
J'ai bien reçu ton mail, je vais jeter un oeil...

VC# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Pour savoir si un évenement a été déclenché (ou pour savoir combien de fois il a été déclenché) je ne vois pas d'autre solution que de faire un counter qui s'incrémente dans l'EventHandler...

En ce qui concerne la deuxième question, c'est l'événement RowsRemoved qui est déclencé lorsqu'une ligne a été supprimé.

VC# forever
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Merci pour ta réponse.


Pour ma 2ème question, j'ai vu que pour un DataGridRow il existait une propriété "State" qui indique si la ligne a été supprimé, ajouté... . Je ne trouve pas l'équivalent pour le DataGridViewRow ? Il existe bien un RowState mais ça ne correspond pas.
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Pour tester si l'événement RowsRemoved a été déclenché, voilà ce que j'ai fait :
J'ai déclaré : 
private
DataGridViewRowsRemovedEventArgs EventRemoveRow;     

Je me suis abonné à l'événement RowsRemoved dans le Load de ma Form :
this
.mvtCaisseDataGridView.RowsRemoved +=
new
DataGridViewRowsRemovedEventHandler(mvtCaisseDataGridView_RowsRemoved);

Dans la fonction mvtCaisseDataGridView_RowsRemoved, j'initialise ma variable EventRemoveRow
private

void mvtCaisseDataGridView_RowsRemoved(
object sender,
DataGridViewRowsRemovedEventArgs e)
{
EventRemoveRow = e;
}

Je fait tout ça car dans l'événement RowValidating je veux savoir si  la ligne en cours est supprimée pour ne pas effectuer mes tests (sinon ça plante).
Voilà comment je fait :
private

void mvtCaisseDataGridView_RowValidating(
object sender,
DataGridViewCellCancelEventArgs e)
{
      
if (EventRemoveRow !=
null)
      {
            
if (e.RowIndex == EventRemoveRow.RowIndex)
            
return;
      }
....

Mon problème est que l'événement RowValidating est déclenché avant le RowsRemoved, du coup il fait quand même les tests et donc tout plante...
Est ce que quelqu'un à un idée ?????
Sinon, je passerai pas une variable Booléenne que j'alimenterai dans mon bouton de suppression mais je trouve ça assez moyen.

Merci
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
L'Event validating ne sert pas à savoir quel genre d'action a été prise sur la row, mais à vérifier son contenu, et d'éventuellement faire un Cancel = true si les données ne coresspondent pas à ce qu'on attend.
D'ailleurs, cet event n'est pas levé si on efface une row!

VC# forever
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Je suis d'accord avec toi sur le fait que l'event Validating sert à vérifier son contenu et non pas le genre d'action et c'est bien pour une vérification que je l'utilise.
Là où je ne suis pas du même avis, c'est que cet event est bien levé lors de la suppression, d'où le fait que j'essaye d'éviter de faire mes contrôles en essayant le type d'action.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Euh, dans la journée j'ai rapidement fait un petit test pour être sûr de ce que je disais, et l'event n'était, me semble-t'il, pas levé.
Es-tu sûr de ne pas faire une autre action qui lèverait cet event ?

VC# forever
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Tout d'abord, merci encore pour ton aide.

Lorsque j'ajoute une ligne, j'initialise automatiquement certaines zones de ma ligne (la date,...). C'est surement cette initialisation qui lève l'événement.


La cinématique est la suivante :


1/ J'ajout plusieurs lignes (Initialisation automatique de certaines zones de ma ligne et intialisation manuelle des autres zones)
2/ Je me positionne sur la 2ème (J'étais précédemment positionné sur la dernière)
3/ Je la supprime ==> OK
4/ Je me positionne sur la dernière
5/ Je la supprime ==> L'event "RowValidating" est déclenché et génère une erreur.


 


 


 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Et quelle est l'erreur?

VC# forever
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

Donc voilà le test que je fais dans le RowValidating
if (
String.IsNullOrEmpty(
Convert.ToString(
this.mvtCaisseDataGridView.CurrentRow.Cells[
"MvtCaisse_Montant"].Value)))
{
   e.Cancel =
true;
   
MessageBox.Show(
"Le montant est obligatoire !",
this.Name,
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}

Si je fais ça, j'ai une boite de dialogue qui apparaît avec le message d'erreur suivant :
System.IndexOutRangeExecption, l'index 2 n'a pas de valeur.

Par contre, si j'enlève la ligne "MessageBox.Show(
"Le montant est obligatoire !",
this.Name,
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
Je n'ai plus de message d'erreur et ma ligne est bien supprimée.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
Essayes voir juste de mettre e.Cancel = true après la messageBox...
Je ne pense pas que ça va changer quand chose mais sait-on jamais.

Si ça marche pas, tu peux éventuellement m'envoyer le projet (ou la partie qui bug en tout cas). Ou encore mieux, le mettre sur un ftp, je jeterai rapidemnet un oeil si c'est pas trop long.

VC# forever
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

J'ai essayé de mettre e.Cancel = true après la messagebox mais sans succès.
Je veux bien t'envoyer la partie qui ne bug, j'ai refait un projet uniquement avec cette partie.
Comment faire pour te l'envoyer ?
Messages postés
117
Date d'inscription
dimanche 14 novembre 2004
Statut
Membre
Dernière intervention
19 janvier 2008

C'est génial, tu es trop fort !!!
La solution était tout simplement de faire le contrôle sur le Cell_Validating !!
En revanche, j'ai pas très bien compris à quoi sert l'événement DataError

Merci encore