Selection cellule DataGridView [Résolu]

thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention - 8 août 2006 à 11:43 - Dernière réponse : thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention
- 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.

 


 
Afficher la suite 

9 réponses

Répondre au sujet
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 8 août 2006 à 11:59
+3
Utile
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#]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sebmafate
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 9 août 2006 à 11:28
+3
Utile
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#]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sebmafate
thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention - 8 août 2006 à 12:29
0
Utile
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.
Commenter la réponse de thorgal1612
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 8 août 2006 à 13:44
0
Utile
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#]
Commenter la réponse de sebmafate
thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention - 9 août 2006 à 10:24
0
Utile
ç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 ????
Commenter la réponse de thorgal1612
thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention - 9 août 2006 à 10:56
0
Utile
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 ....
Commenter la réponse de thorgal1612
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 9 août 2006 à 11:04
0
Utile
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#]
Commenter la réponse de sebmafate
thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention - 9 août 2006 à 11:21
0
Utile
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();
      ...
Commenter la réponse de thorgal1612
thorgal1612 117 Messages postés dimanche 14 novembre 2004Date d'inscription 19 janvier 2008 Dernière intervention - 9 août 2006 à 11:40
0
Utile
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.
Commenter la réponse de thorgal1612

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.