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

Windows Forms Discussion :

Drole de bug avec DataGrid et requete


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Par défaut Drole de bug avec DataGrid et requete
    Bonjour,

    J'ai un drole de bug que je ne comprends pas.

    J'affiche dans un DataGrid le contenu d'une table. J'ai produit une procédure pour valider si la table est vide ou pleine. Si c'est le cas ca n'affiche rien. SINON je call une autre procédure pour afficher les données dans la table.

    Voici le code pour vérifier si la table PIECES est vide ou pleine.

    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
     
     
        Private Sub verifier_trier_piece()
     
            Dim strCon = CStr("provider=microsoft.jet.oledb.4.0;" & "data source= " & Application.StartupPath & "\demandes.mdb" & ";")
            Dim CnEnreg As OleDb.OleDbConnection
            Dim CmdEnreg As OleDb.OleDbCommand
     
     
            CnEnreg = New OleDb.OleDbConnection(strCon)
            CnEnreg.ConnectionString = strCon
            CnEnreg.Open()
     
            CmdEnreg = CnEnreg.CreateCommand() 'Creation de commande
            Dim requete As String = vbEmpty
     
            requete = "SELECT ID_Piece FROM Pieces" 
     
            CmdEnreg.CommandText = requete
            Try
                CmdEnreg.ExecuteNonQuery() 'Exécution de requete
                Dim enumerate As OleDb.OleDbDataReader = CmdEnreg.ExecuteReader()
                If enumerate.HasRows = True Then '' la piece existe!
                    CnEnreg.Close()
                    CnEnreg = Nothing
                    enumerate.Close()
                    enumerate = Nothing
                    CmdEnreg = Nothing
                    Call Me.afficher_DansGrid_Pieces()
     
                Else ' elle n'existe pas.
                    CnEnreg.Close()
                    CnEnreg = Nothing
                    enumerate.Close()
                    enumerate = Nothing
                    CmdEnreg = Nothing
                    MsgBox("Aucune pièce trouvée avec la lettre " & Me.Cbox_Pieces.Text, MsgBoxStyle.Information)
                End If
     
            Catch ex As OleDb.OleDbException
                MsgBox(ex.Message)
                CnEnreg.Close()
                CnEnreg = Nothing
                CmdEnreg = Nothing
     
            End Try
        End Sub
    Après je call cette procédure qui affiche les données dans la table PIECES.

    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
     
     
            Dim strCon$ = CStr("provider=microsoft.jet.oledb.4.0;" & "data source= " & Application.StartupPath & "\Demandes.mdb" & ";")
            Dim CnEnreg As New OleDb.OleDbConnection
            Dim CmdR As New OleDb.OleDbCommand
            Dim DtsetRecherche As New DataSet
            Dim dtAdapteurRecherche As New OleDb.OleDbDataAdapter
            'Dim IEnum As IEnumerator
            CnEnreg.ConnectionString = strCon$
            Dim requete As String
     
            requete = "select Id_Piece from Pieces"
            CnEnreg.Open()
            CmdR = CnEnreg.CreateCommand() 'Creation de commande
            CmdR.CommandText = requete
     
            ' mode non connecté
     
            DtsetRecherche = New DataSet
            Try
     
                ' prepare le code pour afficher le resultat de la requete dans la datagridview
                dtAdapteurRecherche = New OleDb.OleDbDataAdapter
                dtAdapteurRecherche.SelectCommand = CmdR
                dtAdapteurRecherche.Fill(DtsetRecherche, "Pieces")
     
                Me.DG_Techniciens.DataSource = DtsetRecherche.Tables("Pieces")
     
                Me.DG_Pieces.Refresh()
                Me.DG_Pieces.Columns.Item(0).HeaderText = "ID Piece"
                Me.DG_Pieces.Columns.Item(0).Visible = true
     
                Me.DG_Pieces.AllowUserToAddRows = False
                Me.DG_Pieces.AllowUserToDeleteRows = False
                Me.DG_Pieces.AllowUserToOrderColumns = False
                Me.DG_Pieces.AllowUserToResizeColumns = False
                Me.DG_Pieces.AllowUserToResizeRows = False
                CnEnreg = Nothing
                CmdR = Nothing
                dtAdapteurRecherche = Nothing
                'Objet déconnectée
                DtsetRecherche = Nothing
     
            Catch ex As OleDb.OleDbException
                MsgBox(ex.Message)
                CnEnreg = Nothing
                CmdR = Nothing
                dtAdapteurRecherche = Nothing
                'Objet déconnectée
                DtsetRecherche = Nothing
     
     
     
            End Try
            CnEnreg = Nothing
            CmdR = Nothing
            dtAdapteurRecherche = Nothing
            'Objet déconnectée
            DtsetRecherche = Nothing
    A la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.DG_Pieces.Columns.Item(0).HeaderText = "ID Piece"
    tout arrête. Le programme plante. Voici le message d'erreur.


    System.ArgumentOutOfRangeException was unhandled
    Message="L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection. Nom du paramètre*: index"
    ParamName="index"
    Source="mscorlib"
    StackTrace:
    à System.Collections.ArrayList.get_Item(Int32 index) à System.Windows.Forms.DataGridViewColumnCollection.get_Item(Int32 index) à Gestion_Des_Services.Gestions.afficher_DansGrid_Pieces() dans K:\Programme Gestion Des Demandes\Gestion Des Services\Gestion Des Services\Gestions.vb:ligne 464 à Gestion_Des_Services.Gestions.verifier_trier_piece() dans K:\Programme Gestion Des Demandes\Gestion Des Services\Gestion Des Services\Gestions.vb:ligne 309 à Gestion_Des_Services.Gestions.Btn_Trier_Piece_Click(Object sender, EventArgs e) dans K:\Programme Gestion Des Demandes\Gestion Des Services\Gestion Des Services\Gestions.vb:ligne 276 à System.Windows.Forms.Control.OnClick(EventArgs e) à System.Windows.Forms.Button.OnClick(EventArgs e) à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) à System.Windows.Forms.Control.WndProc(Message& m) à System.Windows.Forms.ButtonBase.WndProc(Message& m) à System.Windows.Forms.Button.WndProc(Message& m) à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) à System.Windows.Forms.Application.Run(ApplicationContext context) à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) à Gestion_Des_Services.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81 à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() à System.Threading.ThreadHelper.ThreadStart_Context(Object state) à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) à System.Threading.ThreadHelper.ThreadStart()
    InnerException:
    Le problème est que la table a 2 enregistrements et il y a juste un champ, Id_Piece qui est une clé unique et champ String.

    Le code que vous voyez est utilisé et modifiés pour deux autres DataGrid et ils fonctionnent très bien.

    En dernier recours j'ai détruit le contrôle DataGrid DG_Pieces dans le projet et je l'ai recréé sans modification des propriétés. Rien ne change! Ça plante toujours à la même place.... Si je comprends bien il ne semble pas voir les 2 enregistrements dans la table. mais c'est illogique!

    Avez-vous une idée du problème ?

    Merci

    AngelEvil!

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    deja de faire executenonquery puis executereader c'est étrange
    les 2 executes la requete ...

    après faire une première requete pour voir si ca va retourner des données c'est étrange aussi
    autant faire la requete, si ca ne retourne rien, le datagrid sera vide quand meme


    ensuite pour l'erreur générée c'est parce que ton datagrid n'a pas de colonne au moment ou tu veux modifier le header de la colonne, donc t'as pas du le remplir ...
    ou alors il faut créer les colonnes manuellement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Par défaut
    deja de faire executenonquery puis executereader c'est étrange
    les 2 executes la requete ...
    Hum... dans un exemple de code en mode connecté et pour savoir si la requête retourne des lignes il y avait la ligne suivante pour valider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim enumerate As OleDb.OleDbDataReader = CmdEnreg.ExecuteReader()
                If enumerate.HasRows = True Then '' la piece existe!
    La raison de cette méthode ? PArce que je n'ai pas trouvé l'équivalent en mode non connecté. Donc on se débrouille avec les moyens qu'on a!

    après faire une première requete pour voir si ca va retourner des données c'est étrange aussi
    autant faire la requete, si ca ne retourne rien, le datagrid sera vide quand meme
    Heuuu j'ai pas la même logique! Pourquoi demander de faire de quoi quand ce n'est pas nécessaire ? Pourquoi essayer d'afficher de quoi quand il n'y a rien ?!?!?!?!!? A moins que ça n'affiche pas les nom des colonnes (header) c'est ok! Sinon je dois valider. C'est le client qui ne veut pas voir des entêtes (header) dans les DataGrid lorsqu'il n'y a pas d'info à afficher.


    ensuite pour l'erreur générée c'est parce que ton datagrid n'a pas de colonne au moment ou tu veux modifier le header de la colonne, donc t'as pas du le remplir
    Si ce que vous dites est exact pourquoi pour les deux autres DataGrid qui ont le même code (sauf le nom du DataGrid qui change) tout fonctionne à la perfection ?!!??!

    Avec le code suivant ca affecte le résultat de la requete au DataGrid.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                dtAdapteurRecherche = New OleDb.OleDbDataAdapter
                dtAdapteurRecherche.SelectCommand = CmdR
                dtAdapteurRecherche.Fill(DtsetRecherche, "Pieces")
     
                Me.DG_techniciens.DataSource = DtsetRecherche.Tables("Pieces")
     
                Me.DG_Pieces.Refresh()
                Me.DG_Pieces.Columns.Item(0).HeaderText = "Nom de la pièce"
                Me.DG_Pieces.Columns.Item(0).Visible = True
    Il y a bien 2 enregistrements! Donc ils devraient être affichés et surtout la colonne devrait être affiché! Surtout que c'est juste un champ dans la table!

    Merci de vos éclaircissements!

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Par défaut
    Bon en lisant la FAQ sur les combobox j'ai trouvé du code qui relie le combo avec un datadapteur.

    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
     
        Private Sub Btn_Trier_Piece_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Trier_Piece.Click
     
                Dim con As OleDb.OleDbConnection
                Dim cs As String = CStr("provider=microsoft.jet.oledb.4.0;" & "data source= " & Application.StartupPath & "\Demandes.mdb" & ";")
                Dim da As OleDb.OleDbDataAdapter
                Dim ds As DataSet
     
                con = New OleDb.OleDbConnection(cs)
     
                da = New OleDb.OleDbDataAdapter("SELECT Id_Piece as [Nom Pièce] FROM pieces", con)
                ' pour avoir des noms différents pour les colonnes du DataGrid
                ' utiliser des alias SELECT Champ1 AS NouveauNom
     
                ds = New DataSet("Pieces")
     
                da.Fill(ds, "Pieces")
     
                DG_Pieces.DataBindings(ds, "Pieces")
     
        End Sub
    Cette ligne plante....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DG_Pieces.DataBindings(ds, "Pieces")
    Le message est le suivant :
    Property access must assign to the property or use this value
    Je ne suis pas bilingue. Et je suis le code de la FAQ.... je suis perdu!

    Merci

    AngelEvil!

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien en numérisation
    Inscrit en
    Juillet 2002
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien en numérisation

    Informations forums :
    Inscription : Juillet 2002
    Messages : 338
    Par défaut
    oki C'est vraiment la connexion avec l'objet qui cause problème... Résolu!

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

Discussions similaires

  1. Drole de bug avec Calloc !
    Par dmichel dans le forum C
    Réponses: 22
    Dernier message: 26/04/2007, 16h02
  2. Bug avec requete
    Par arsgunner dans le forum ASP
    Réponses: 8
    Dernier message: 14/06/2004, 16h25
  3. [C#] Bug (?) avec la propriété TransparencyKey de la Form
    Par FrigoAcide dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/05/2004, 14h14
  4. Requete avec une sous-requete... Ne fonctionne qu'a moitie..
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 18/08/2003, 09h54
  5. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21

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