IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Méthode et fonction sur un DataGridView [Débutant]


Sujet :

C#

  1. #1
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut Méthode et fonction sur un DataGridView
    Re-Bonjour

    Par contre ici je but depuis 2 jours.
    Ci dessous le code VB que j'utilise pour me permettre de vérifier la saisie dans les cellules ( genre longueur de frappe, remplacer les points par des virgules, vérifier la double frappe de virgule,...)
    Là c'est plus compliqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
       Private Sub LongueurTexteDgGrille(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGrille.EditingControlShowing
                Dim Cellule As DataGridViewTextBoxEditingControl
     
                Try
                      'limite la longueur de char dans les Cellule
                      Select Case DGrille.Columns(DGrille.CurrentCell.ColumnIndex).Name
     
                            Case "NumArticle"
                                  Try
                                        Cellule = CType(e.Control, DataGridViewTextBoxEditingControl)
                                        Cellule.MaxLength = 25 'longueur du texte max 
                                  Catch ex As Exception
                                  End Try
     
                            Case "Quantite"
                                  Try
                                        Cellule = CType(e.Control, DataGridViewTextBoxEditingControl)
                                        Cellule.MaxLength = 10 'longueur du texte max 
                                  Catch ex As Exception
                                  End Try
     
     
                            Case "PrixUnitaire"
                                  Try
                                        Cellule = CType(e.Control, DataGridViewTextBoxEditingControl)
                                        Cellule.MaxLength = 10 'longueur du texte max 
                                  Catch ex As Exception
                                  End Try
     
                            Case "RemiseLigne"
                                  Try
                                        Cellule = CType(e.Control, DataGridViewTextBoxEditingControl)
                                        Cellule.MaxLength = 4 'longueur du texte max 
                                  Catch ex As Exception
                                  End Try
     
                      End Select
     
                Catch
                End Try
     
          End Sub
     
          Private Sub dgListe_Separateur(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGrille.EditingControlShowing
                Dim voControl As DataGridViewTextBoxEditingControl = Nothing
     
                'je récupère le control TextBox de la cellule qui est édité        
                voControl = CType(e.Control, DataGridViewTextBoxEditingControl)
     
                'Je recupere le Handles de KeyDown sur toutes les colonnes
                RemoveHandler voControl.KeyDown, AddressOf EditingControl_KeyDown
                AddHandler voControl.KeyDown, AddressOf EditingControl_KeyDown
     
                'si la colonne qui est éditée est une de nombres alors on gère l'événement KeyPress du TextBox             
                Select Case Me.DGrille.Columns(DGrille.CurrentCell.ColumnIndex).Name
     
                      Case "Quantite", "PrixUnitaire", "RemiseLigne"
     
                            RemoveHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
                            AddHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
     
                      Case Else
     
                            RemoveHandler voControl.KeyPress, AddressOf EditingControl_KeyPress
     
                End Select
     
          End Sub
     
          Private Sub EditingControl_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
     
                'Calcul la tva inverse sur la ligne en cours
                If e.KeyCode = Keys.F3 Then CalCulInverseTva(DGrille.CurrentRow.Index)
     
                'Supprime la ligne en cours dans le datagridview
                If e.KeyCode = Keys.F5 Then DGrille.Rows.Remove(DGrille.CurrentRow)
     
          End Sub
     
          Private Sub EditingControl_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
                Dim vsDecimalSeparator As Char
     
                'j'accepte que les caractères numériques, le point, ou la virgule        
                e.Handled = Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Or e.KeyChar = "." Or e.KeyChar = ",")
     
                'je récupère le texte du TextBox
                Dim txt As String = CType(sender, DataGridViewTextBoxEditingControl).Text
     
                'je regarde que le point ou la virgule n'a été tapé qu'une fois
                If (InStr(txt, ".") > 0 Or InStr(txt, ",") > 0) And (e.KeyChar = "." Or e.KeyChar = ",") Then
     
                      e.KeyChar = Nothing
     
                Else
     
                      'je remplace le point par une virgule  en fonction du séparateur décimal utilisé dans la culture en cours
                      vsDecimalSeparator = CChar(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator)
     
                      If vsDecimalSeparator <> "." And e.KeyChar = "." Then
     
                            e.KeyChar = vsDecimalSeparator
     
                      End If
     
                End If
     
          End Sub
    La Connaissance est comme la joie elle s'accroît en la partageant!

  2. #2
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    C'est un peu overkill, non?

    Pourquoi ne pas utiliser l’événement CellValidating?
    Exemple de la documentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    private void dataGridView1_CellValidating(object sender,
        DataGridViewCellValidatingEventArgs e)
    {
        dataGridView1.Rows[e.RowIndex].ErrorText = "";
        int newInteger;
     
        // Don't try to validate the 'new row' until finished 
        // editing since there
        // is not any point in validating its initial value.
        if (dataGridView1.Rows[e.RowIndex].IsNewRow) { return; }
        if (!int.TryParse(e.FormattedValue.ToString(),
            out newInteger) || newInteger < 0)
        {
            e.Cancel = true;
            dataGridView1.Rows[e.RowIndex].ErrorText = "the value must be a non-negative integer";
        }
    }
    Pour les nombres, virgule ou point seront acceptés en fonction de la Culture.

    Le type DataGridViewCellValidatingEventArgs possède une propriété ColumnIndex qui te permettra de définir différents cas de validation.


    Edit: allez, j'avais un peu de temps à perdre... Par exemple, pour du texte d'au plus 4 caractères dans la première colonne, et un nombre arrondi à 2 décimales et inférieur à 100 dans la deuxième:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
            private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
            {
                dataGridView1.Rows[e.RowIndex].ErrorText = "";
     
                switch (e.ColumnIndex)
                {
                    case 0:
                        if (e.FormattedValue.ToString().Length > 4)
                        {
                            e.Cancel = true;
                            dataGridView1.Rows[e.RowIndex].ErrorText = "le texte est trop long";
                        }
                        break;
     
                    case 1:
                        double newDouble;
                        if (dataGridView1.Rows[e.RowIndex].IsNewRow) { return; }
                        if (!double.TryParse(e.FormattedValue.ToString(),
                            out newDouble) || newDouble > 100)
                        {
                            e.Cancel = true;
                            dataGridView1.Rows[e.RowIndex].ErrorText = "il faut rentrer un nombre valide, et inférieur à 100";
                        }
                        else
                        {
                            newDouble = Math.Round(newDouble, 2);
                            dataGridView1.EditingControl.Text = newDouble.ToString();
                        }
                        break;
                }
            }
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  3. #3
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    Bonjour nouanda

    La méthode reprise dans le code ne retournai pas de message d'erreur, mais bloquait la saisie a 4 caractères. Ce n'était pas un validation mais un blocage dans la saisie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Case "NumArticle"
                                  Try
                                        Cellule = CType(e.Control, DataGridViewTextBoxEditingControl)
                                        Cellule.MaxLength = 25 'longueur du texte max 
                                  Catch ex As Exception
                                  End Try
    impossible de taper plus de 25 caractères dans la cellule
    La Connaissance est comme la joie elle s'accroît en la partageant!

  4. #4
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    ha ok.

    Dans ce cas, pourquoi ne pas utiliser la propriété MaxInputLength des colonnes?
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  5. #5
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    Bonjour nouanda

    Oui effectivement . Un peut d'ajustement et cela fonctionne bien
    Du coup, peut être aussi valable pour le type de donnée autorisé dans les cellules? genre ValueType ?
    Afin de ne pas autorisé les point(.)
    La Connaissance est comme la joie elle s'accroît en la partageant!

  6. #6
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    J'essaye de trouver une solution pour n’autorisé que du numérique dans certaines cellules de mon datagridview, de modifier le point(.) qui serait tapé en virgule(,) , ... .
    Mais là je coince un peut . Je regarde avec ValueType, mais est-ce la bonne méthode.
    Une idée ou piste serait la bienvenue.
    La Connaissance est comme la joie elle s'accroît en la partageant!

  7. #7
    Membre actif
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2016
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2016
    Messages : 154
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par thierry007 Voir le message
    J'essaye de trouver une solution pour n’autorisé que du numérique dans certaines cellules de mon datagridview, de modifier le point(.) qui serait tapé en virgule(,) , ... .
    Mais là je coince un peut . Je regarde avec ValueType, mais est-ce la bonne méthode.
    Une idée ou piste serait la bienvenue.
    Bonjour,
    Pour n'autoriser qu'une valeur numerique dans une cellule de mon DG je teste la valeur de la cellule avec l'intruction If
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if IsNumeric(datagridview......) then
    Travail à faire
     
    else
     
    End If

  8. #8
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    Bonjour Prisson

    Si tu regardes dans le premier message , tu trouveras le code en VB qui permet de réguler la saisie bloquer les longueur de texte dans les cellules , remplacer le point (.) par la virgule et n'autorisé que le numérique. Je souhaiterais faire de même en c#.
    La Connaissance est comme la joie elle s'accroît en la partageant!

  9. #9
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    Sous l'inspiration de morceaux de code VB , j'ai retranscris le bout ci-dessous.
    Mais je rencontre un problème lorsque je veux récupérer le contrôle dans la partie EditingControlShowing afin de le placer dans un textbox pour le traitement.
    Voici ce que cela donne. Si quelqu'un peut m'aider ou a des suggestion, je suis preneur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
                private void DgGrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
                {
                      // je fais un cast et recupere le controle ( mais sa ne vas pas )
                      TextBox txtEdition = (e.Control)sender;
     
                      //j'ajoute le handle Keypress
                      txtEdition.KeyPress += Txt_Edition;
                }
     
                private void Txt_Edition(object sender, KeyPressEventArgs e)
                {
                      DataGridViewCell cellule = DgGrid.CurrentCell;
                      switch (DgGrid.Columns[cellule.ColumnIndex].Name)
                      {
                            case "colonnePrixUnit":   // Nombre avec virgule flottante
     
                                  TextBox txtDecimal = (TextBox)sender;
     
                                  string separateur = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
                                  if (("0123456789".Contains(e.KeyChar.ToString()) == true))
                                  {
                                        // Les chiffres sont acceptés
                                        return;
                                  }
                                  else if ((",.".Contains(e.KeyChar.ToString()) == true))
                                  {
                                        // Traitement de la virgule et du point
                                        if ((txtDecimal.Text.Contains(separateur) == false))
                                        {
                                              // On modifie la touche en séparateur décimal courant
                                              e.KeyChar =Convert.ToChar (  separateur);
                                              return;
                                        }
                                        else
                                        {
                                              // Il y a déjà une virgule, on considère comme traité
                                              e.Handled = true;
                                        }
     
                                  }
                                  else if ((e.KeyChar != Convert.ToChar(Keys.Back)))
                                  {
                                        // On accepte le backspace, le reste est oublié
                                        e.Handled = true;
                                  }
     
                                  break;
                            case "colonneQuantite": // Nombre entier uniquement
     
                                  if (("0123456789".Contains(e.KeyChar.ToString()) == true))
                                  {
                                        // On accepte les chiffres
                                        return;
                                  }
                                  else if ((e.KeyChar != Convert.ToChar(Keys.Back)))
                                  {
                                        // On accepte le backspace, le reste est oublié
                                        e.Handled = true;
                                  }
     
                                  break;
                      }
     
                }
    La Connaissance est comme la joie elle s'accroît en la partageant!

  10. #10
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    A bein voila: solution après recherche et remise en sauce, pour ceux que cela intéresse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
      private void DGrid_Load(object sender, EventArgs e)
                {
                      DgGrid.ColumnCount = 2;
                      DgGrid.Columns[0].Name = "colonnePrixUnit";
                      DgGrid.Columns[1].Name = "colonneQuantite";
                      DgGrid.RowCount = 10;
     
                }
                private void DgGrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
                {
                      e.Control.KeyPress -= new KeyPressEventHandler(Txt_Edition);
     
                      DataGridViewCell cellule = DgGrid.CurrentCell;
                      switch (DgGrid.Columns[cellule.ColumnIndex].Name)
                      {
                            case "colonnePrixUnit":
                            case "colonneQuantite":
                                  TextBox tb = e.Control as TextBox;
                                  if (tb != null)
                                  {
                                        tb.KeyPress += new KeyPressEventHandler(Txt_Edition);
                                  }
                                  break;
                      }
                }
     
                private void Txt_Edition(object sender, KeyPressEventArgs e)
                {
                      // Autorise uniquement le numériques et le séparateur décimal choisi
                      if (e.KeyChar == '.') e.KeyChar = ','; // pour les claviers avec le point(.), je change par la virgule
     
                      if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != ',')
                      {
                            e.Handled = true;
                      }
     
                      // Je n'accepte que un seul séparateur decimale
                      if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1 || e.KeyChar == ',' && (sender as TextBox).Text.IndexOf(',') > -1)
                      {
                            e.Handled = true;
                      }
     
                }
    La Connaissance est comme la joie elle s'accroît en la partageant!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pointeur de fonction sur des méthodes de QTime
    Par Gébix dans le forum Débuter
    Réponses: 1
    Dernier message: 22/07/2012, 11h40
  2. Méthode de tests sur des fonctions C
    Par yas13 dans le forum C
    Réponses: 3
    Dernier message: 26/06/2008, 18h20
  3. Pointeur de fonctions sur méthode
    Par Glosialabolas dans le forum C++
    Réponses: 9
    Dernier message: 04/12/2005, 14h55
  4. Réponses: 2
    Dernier message: 01/05/2004, 21h15
  5. [LG]Symbole # (dièse) et fonctions sur les chaînes
    Par James64 dans le forum Langage
    Réponses: 6
    Dernier message: 24/03/2004, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo