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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé 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
    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

  2. #2
    Membre chevronné
    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
    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;
                }
            }

  3. #3
    Membre éprouvé 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
    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

  4. #4
    Membre chevronné
    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
    Par défaut
    ha ok.

    Dans ce cas, pourquoi ne pas utiliser la propriété MaxInputLength des colonnes?

  5. #5
    Membre éprouvé 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
    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(.)

  6. #6
    Membre éprouvé 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
    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.

+ 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