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

VB.NET Discussion :

e.rowindex n'a pas la valeur attendue dans l’évent du Datagridview CellEndEdit.


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut e.rowindex n'a pas la valeur attendue dans l’évent du Datagridview CellEndEdit.
    Bonjour à tous ,
    J'ai encore un petit problème :
    Je cherche à valider le contenu d'une cellule lorsque l'utilisateur à terminé la saisie complète du texte dans la cellule. Je tente d'utiliser pour cela le code suivant :

    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
     Private Sub DataGridViewMain_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewMain.CellEndEdit
            Dim ColName As String = DataGridViewMain.Columns(e.ColumnIndex).Name
            Dim key As Integer = CInt(ValuefromDB(DataGridViewMain.Rows(e.RowIndex).Cells("Key").Value))
            Dim Value As Object = ValuefromDB(DataGridViewMain.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
     
            Select Case ColName
                Case "Repere"
                    Dim NewRepere As String = CType(Value, String)
                    If _Projet.Segments.DicoRepere.ContainsKey(NewRepere) Then
                        MessageBox.Show(String.Format("le Repere {0} existe déja dans la collection, l'opération va être annulée", NewRepere), "Repere existant", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Else
                        _Projet.Segments(key).Repere = CType(Value, String)
                    End If
            End Select
        End Sub
    Le problème c'est que j'au un tri automatique justement sur la colonne qui contient la cellule que je veux éditer et valider, et les valeurs que j'obtient correspondent aux valeurs de la ligne qui vient en remplacement de ma ligne en cours d’édition une fois le trie effectué.
    Je ne comprends pas du tout ce comportement. Lorsque je suis dans l'event de EndEdit de la cellule je m'attends à obtenir un e.rowindex qui me permet de lire la dite cellule....hors ce n'st pas le cas.

    Pouvez vous m'aider et m'expliquer un peu ce qui se passe...

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    c'est peut être dans l'event DataGridViewMain_CellBeginEdit qu'il faut faire ton traitement !!!

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour Mabrouki, Merci de m'avoir répondu.
    J'ai testé BeginEdit et comme je le supposé l’événement se déclenche au moment ou l'utilisateur rentre dans la cellule en mode Edition et non à la fin de l’édition comme je voudrais. Mais par contre, oui, je récupère les infos de la bonne ligne dans ce BeginEdit.
    Est ce que cela signifie qu'il faut utiliser BeginEdit pour mémoriser le ligne dans une variable afin de rappeler celle ci dans dans le EndEdit, j'avoue que je suis surpris que le e.rowindex ne me renvoi pas la bonne ligne. C'est un paramètre censé être lié au contexte de l’évent en question.
    Je vais pas parler de bug du Datagridview car il m'arrive souvent de me tromper mais.... Qu'en pensez vous ? Comment faire le plus correctement possible la validation de ma cellule ?

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Rebonjour, J'apporte une précision et j'aimerais peut-être en profiter pour déplacer mon code de validation dans un event du DataTable et non du DataGridView mais là aussi je ne trouve pas la solution.

    En complément d'information :
    1- J'ai un datable lié au Dgv par l'intermediaire d'un bindingsource.
    2- C'est ce datatable qui effectue le trie sur une colonne à l'aide de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonDatatable.DefaultView.Sort
    Problème avec les events du Datatable comme ColumnChanged par exemple :
    Celui-ci est levé à chaque saisie du clavier et non à la fin de l’édition.

    J'aimerais beaucoup que vous puissiez m'aider.

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    rebonjour

    c'est une combinaison de 2 events qu'il faut utiliser ataGridView1_CellValidating & DataGridView1_CellEndEdit...
    Dans DataGridView1_CellValidating:
    -DataGridView1.Rows(e.RowIndex).Cells("Repere").Value contient l'ancienne valeur de la Cell

    -e.FormattedValue.ToString contient la nouvelle valeur saisie de la Cell

    exemple code .vb SDK MSDN intitule
    "Procédure pas à pas : validation des données dans le contrôle DataGridView Windows Forms"
    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
     
    Public Class Form1
        Inherits System.Windows.Forms.Form
     
        Private WithEvents dataGridView1 As New DataGridView()
        Private bindingSource1 As New BindingSource()
     
        Public Sub New()
     
            ' Initialize the form.
            Me.dataGridView1.Dock = DockStyle.Fill
            Me.Controls.Add(dataGridView1)
            Me.Text = "DataGridView validation demo (disallows empty CompanyName)"
     
        End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Me.Load
     
        ' Initialize the BindingSource and bind the DataGridView to it.
        bindingSource1.DataSource = GetData("select * from Customers")
        Me.dataGridView1.DataSource = bindingSource1
        Me.dataGridView1.AutoResizeColumns( _
            DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
     
    End Sub
     
    Private Sub dataGridView1_CellValidating(ByVal sender As Object, _
        ByVal e As DataGridViewCellValidatingEventArgs) _
        Handles dataGridView1.CellValidating
     
        ' Validate the CompanyName entry by disallowing empty strings.
        If dataGridView1.Columns(e.ColumnIndex).Name = "CompanyName" Then
            If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then
                dataGridView1.Rows(e.RowIndex).ErrorText = _
                    "Company Name must not be empty"
                e.Cancel = True
            End If
        End If
     
    End Sub
     
    Private Sub dataGridView1_CellEndEdit(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
        Handles dataGridView1.CellEndEdit
     
        ' Clear the row error in case the user presses ESC.   
        dataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
     
    End Sub
     
    ' Cet exemple de code utilise une méthode GetData qui retourne un objet DataTable rempli. Soyez sûr que vous définissez la ' variable connectionString avec une valeur appropriée pour votre base de données. 
    Private Shared Function GetData(ByVal selectCommand As String) As DataTable
     
        Dim connectionString As String = _
            "Integrated Security=SSPI;Persist Security Info=False;" + _
            "Initial Catalog=Northwind;Data Source=localhost;Packet Size=4096"
     
        ' Connect to the database and fill a data table.
        Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
        Dim data As New DataTable()
        data.Locale = System.Globalization.CultureInfo.InvariantCulture
        adapter.Fill(data)
     
        Return data
     
    End Function
    le dico et le reste dépendent de ce que veux comme resultat !!!
    bon code..

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci pour la réponse MABROUKI, c'est courageux à 3 heures du matin
    Quelques petites remarques après quelques tests :
    A Priori dans DataGridView1_CellValidating : DataGridView1.Rows(e.RowIndex).Cells("Repere").Value ne contient pas l'ancienne valeur de la Cell.
    Le CellValidating ne se déclenche pas à la fin du mode Edition de la cellule, pour cela il faut rajouter me.validate dans DataGridView1_CellEndEdit.

    la ou ça pose problème c'est que CellValidating se déclenche même sur une simple sélection/desélection sans que je modifie la cellule. Donc ça ne fonctionne pas puisque le test que je fait, est de m'assurer que la valeur de la cellule (qui est en réalité une clé) n'existe pas déjà dans un dictionnaire. Donc il me dit à chaque fois que je passe sur la cellule que la valeur existe déjà. C'est pourquoi je veux attendre la fin du mode édition avant de faire mon test et afficher à l’utilisateur si la valeur existe déjà.

    Petite parenthèse : je trouve ça gênant de faire un Row.ErrorText (ou un Cell.Errortext) et laissé une valeur erroné dans le Dgv, je préféré annuler purement et simplement la saisie, (sauf si je ne peux pas faire autrement).

    Aussi je cherche une solution plutôt du coté Event du Datatable mais de ce coté là je je ne suis pas certain de récupérer un Event qui se produirait uniquement à la fin du mode édition de la cellule du DatagridView (ou de n'importe quel autres contrôles d'ailleurs puisque je suis Databindé).

    Bug de l’évent Datagridview.CellEndEdit ??? J'adore VB.Net et ce que je vais dire risque de ne pas plaire mais pourtant je pense clairement que le e.Rowindex est bugué. Donc impossible à utiliser à moins de passer par une variable public pour stocker ma ligne dehors de l'event. Si je ne trouve de meilleur solution c'est ce que je fairait probablement mais je ne trouve pas çà très propre.

    Je suis ouvert à toutes les idées, donc n’hésitez pas....

  7. #7
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut DatagridView...
    C'est un peu lourd à mettre en œuvre pour un test et c'est donc sans certitude que je fais la suggestion suivante :

    1. Désactiver le Sort "automatique" avant la validation, par exemple sur l'évènement CellBeginEdit;
    2. Réactiver le tri juste avant la sortie de ta procédure, après la validation.



    Courage ...

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/08/2012, 18h11
  2. Select Case ne renvoie pas la valeur attendue
    Par H.ile dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/01/2009, 14h58
  3. [MySQL] requête qui n'insère pas les valeurs attendues
    Par mimi83 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2008, 03h07
  4. [Prototype] [1.5.1] $() ne retourne pas la valeur attendue
    Par WebTotoche dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 29/08/2007, 19h19
  5. [POO] Variable ne contenant pas la valeur attendue
    Par norby042 dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2006, 10h06

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