Selection cellule DataGridView

Résolu
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008 - 8 août 2006 à 11:43
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008 - 9 août 2006 à 11:40
Bonjour,


J'ai encore une fois besoin de votre aide.


J'ai un DataGridView dans lequel j'ajoute des lignes pas un bouton.
Lorsque je crée un ligne je voudrais non seulement me positionner sur une cellule mais aussi que le curseur soit actif (Comme si j'avais double cliqué sur cette cellule).


J'arrive à me positionner en faisant this.mvtCaisseDataGridView.CurrentRow.Cells["MvtCaisse_Montant"].Selected = true; mais pas à rendre actif le curseur.
Ma 2ème question : Lorsque j'ajoute une nouvelle ligne (en cliquant sur mon bouton), je voudrais contrôler si une des zones de mon Grid est bien renseignée pour la ligne courante.
J'ai mis le code dans l'évenement "RowValidated" du DataGridView:
privatevoid mvtCaisseDataGridView_RowValidated(object sender, DataGridViewCellEventArgs e)
{
try

{
if (String.IsNullOrEmpty(Convert.ToString(this.mvtCaisseDataGridView.CurrentRow.Cells["MvtCaisse_Montant"].Value)))
thrownewException("Le montant est obligatoire");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Il m'affiche bien le message mais ajout tout de même la nouvelle ligne.
J'espère que j'ai été assez clair

Merci.

 


 

9 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 août 2006 à 11:59
Pour ta première question... as-tu essayé en invoquant la méthode BeginEdit ? (sur l'objet DataSource de mémoire)

et pour la seconde l'évènement RowValidated arrive trop tard (Validated, c'est du passé), utilise plutot l'évènement Validating (présent donc) qui t'offre la possibilité d'annuler la validation en passant False à sa propriété Cancel.

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
9 août 2006 à 11:28
tu ne peux pas arrêter le click...

mais tu peux faire ceci :

try
{
      this.ControleMontant();
}
catch(Exception ex)
{
      MessageBox.Show(ex.Message,this.Name,MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
      return; // ca force à sortir de la méthode immédiatement.
}
this.mvtCaisseBindingSource.AddNew();

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
3
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008
8 août 2006 à 12:29
Merci pour ta réponse.
Le BeginEdit fonctionner parfaitement.

Par contre pour la validation, je me suis rendu compte après mon post qu'il fallait mettre mon code dans le RowValidatingJ'ai essayé avec e.Cancel False et aussi avec e.Cancel True mais ça ne marche pas.

Du coup, voilà ce que j'ai essayé : Avant la création d'une nouvelle ligne, je déclenche l'évenement RowValidating en gérant l'exception
private
void mvtCaisseDataGridView_RowValidating(
object sender,
DataGridViewCellCancelEventArgs e)
{

      if (
String.IsNullOrEmpty(
Convert.ToString(
this.mvtCaisseDataGridView.CurrentRow.Cells[
"MvtCaisse_Montant"].Value)))
      
throw
new
Exception(
"Le montant est obligatoire");

}

Et sur le bouton :
private

void picRemiseBanque_Click(
object sender,
EventArgs e)
{
   
try
   {

         this.mvtCaisseDataGridView.RowValidating +=
new
DataGridViewCellCancelEventHandler(mvtCaisseDataGridView_RowValidating);
    }

   catch (
Exception ex)
   {

         MessageBox.Show(ex.Message);
    }

   this.mvtCaisseBindingSource.AddNew();

Mais dans ce cas, j'ai l'erreur suivante : l'exception Exception n'a pas été gérée par le code utilisateur.
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 août 2006 à 13:44
normal... car dans ton try/catch, tu attaches un délégué à l'évènement RowValidating de ton DataGirdView... cette opération (sauf ca exceptionnel) ne déclenchera pas d'erreur.

le mieux est de traiter l'erreur directement dans le délégé :

privatevoid mvtCaisseDataGridView_RowValidating(
object sender,
DataGridViewCellCancelEventArgs e)
{

      if (
String.IsNullOrEmpty(
Convert.ToString(
this.mvtCaisseDataGridView.CurrentRow.Cells[
"MvtCaisse_Montant"].Value)))
      MessageBox.Show("Le montant est olibgatoire");
      e.Cancel = True;

}

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008
9 août 2006 à 10:24
ça ne fonctionne pas. J'ai bien l'erreur mais une nouvelle ligne est tout de même ajoutée.
il faudrait que j'arrive à ne pas déclencher l'évènement "Click" de mon bouton si l'évènement "RowValidating" provoque une erreur.
Je ne sais pas si c'est possible ????
0
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008
9 août 2006 à 10:56
Bon, j'ai essayé autre chose mais ça ne fonctionne pas non plus,








try

{


      this
.ControleMontant();
}


catch
(

Exception
ex)
{
      

MessageBox
.Show(ex.Message,

this
.Name,

MessageBoxButtons
.OK,

MessageBoxIcon
.Exclamation);
}


finally

{
      

this
.mvtCaisseBindingSource.AddNew();
      ...


}
J'ai bien mon message d'erreur mais il ajoute execute toujours le "AddNew".
J'ai aussi essayé en enlevant le finally mais c'est la même chose.

Je comprends rien ....
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
9 août 2006 à 11:04
attention... je crois que tu te trompes dans l'utilisation du try/catch/finally.


Le finally est exécuté quoiqu'il arrive... (erreur ou pas erreur).


Autre chose... il ne faut pas accroché le délégué de l'évènement RowValidating au moment du clic sur le bouton mais au plus tard dans le load du formulaire. ainsi, l'erreur se déclenchera avant même que tu cliques sur le bouton.






Sébastien FERRAND
(

blog
)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008
9 août 2006 à 11:21
Merci encore pour ton aide. Je suis désolé mais j'ai du mal à comprendre.
Le Finally s'exécute qu'il y est erreur ou pas. J'ai essayé de l'enlever, j'ai bien une erreur mais il ajoute qd même ma ligne.
Comment faire pour que l'action "Click" s'arrête ?

try
{
      this
.ControleMontant();
}

catch(
Exceptionex)
{
      
MessageBox.Show(ex.Message,
this.Name,
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}

this.mvtCaisseBindingSource.AddNew();
      ...
0
thorgal1612 Messages postés 117 Date d'inscription dimanche 14 novembre 2004 Statut Membre Dernière intervention 19 janvier 2008
9 août 2006 à 11:40
Merci beaucoup, ça marche !

Je crois que j'ai pas très bien compris les try/catch. Je pensai que le catch arrêtait l'action en cours.
0
Rejoignez-nous