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 :

"La référence d'objet n'est pas définie à une instance d'un objet" [Débutant]


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 773
    Points : 275
    Points
    275
    Par défaut "La référence d'objet n'est pas définie à une instance d'un objet"
    Bonjour,

    J'ai 2 events associés à un DataGridView
    Mouseup
    KeyUp

    Pour ces 2 Events, je renvoie à une même sub appelons-là MySub()

    Je souhaite maintenant rajouter l'event SelectionChanged et lui associer aussi MySub
    Mais là, je reçois une msgbox qui dit : "La référence d'objet n'est pas définie à une instance d'un objet" .
    En cliquant sur OK, l'action se poursuit et Mysub semble être correctement réalisée.

    Comment interpréter ce message et où chercher pour corriger l'erreur ?
    Peut-être une piste : Lors de l'événement SelectionChanged, la datasource de mon Datagrid change. Or MySub agit sur les lignes de MySub. Lors du SelectionChanged, n'y aurait-il pas une fraction de seconde où les lignes disparaissent faisant alors entrer en action MySub avant que les nouvelles lignes réapparaissent, ce qui expliquerait le plantage ?

  2. #2
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Un peu de code permettrait de mieux t'aider.
    N'oubliez pas le tag et

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 773
    Points : 275
    Points
    275
    Par défaut
    Ne sachant pas trop d'où peut venir le problème, je suis obligé de reproduire ici le code de MySub en entier.

    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
    Private Sub MySub()
            'séléctionne toute la ligne active
            Me.MonDataGridView.CurrentRow.Selected = True
     
            ' synchronise MonDataGridView avec les champs Vins consommés
            Dim RéférenceActive As Integer
            RéférenceActive = Me.MonDataGridView.CurrentRow.Cells(0).Value 'Valeur du champ Référence dans la ligne active
            Me.dataview1.RowFilter = "Référence = " & RéférenceActive
     
            For Each moncontrol As Control In SPC2.Panel2.Controls
                moncontrol.DataBindings.Clear()
            Next
            Me.MonDateTimePicker.DataBindings.Add("text", dataview1, "Champ5")
            Me.NUM1.DataBindings.Add("Value", dataview1, "Champ4")
            Me.TXT2.DataBindings.Add("text", dataview1, "Champ3")
            Me.TXT3.DataBindings.Add("text", dataview1, "Champ2")
            Me.TXT1.DataBindings.Add("text", dataview1, "Champ1")
     
            MonCm = CType(Me.BindingContext(Me.dataview1), CurrencyManager)
        End Sub

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par noftal Voir le message
    Mais là, je reçois une msgbox qui dit : "La référence d'objet n'est pas définie à une instance d'un objet" .
    En cliquant sur OK, l'action se poursuit et Mysub semble être correctement réalisée.
    si c'est un msgbox, c'est toi qui a mis son appel
    sinon ca peut etre un message de visual studio, auquel cas il est possible de voir la ligne qui passe en erreur
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre expérimenté Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Points : 1 699
    Points
    1 699
    Par défaut
    Vu que le code que tu as posté ne contient pas de MessageBox, il serait bien de mettre un point d'arrêt au début de ton event afin de faire un débogage pas à pas pour voir l'origine de l'exception.
    N'oubliez pas le tag et

  6. #6
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 773
    Points : 275
    Points
    275
    Par défaut
    Ca doit provenir d'un catch/try qui doit se trouver dans la sub Form.load.

    Je regarde et je vous tiens au courant.

  7. #7
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    773
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 773
    Points : 275
    Points
    275
    Par défaut
    Bon alors voici le résultat.
    Tout d'abord, à coup d'espions et de points d'arrêts et de pas à pas, j'ai fini par découvrir que mes codes d'initialisation du form (codées dans l'event Form_load) engendrent des Events non désirés. En clair, avant même d'arriver au bout de l'Event Form_load, les Events associés à certains contrôles sont activés alors que cela n'a pas de sens.

    Exemple

    Mon form_load ressemble à cela (j'ai simplifié) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private sub form_load...
    réinit_Combobox()
    ' ceci a pour effet de remettre l'index de mes combobox à -1
    '... et pour effet secondaire d'activer le code combobox_selectedindexchanged !
     
    DG.datasource = ...
    ' ceci a pour effet d'affecter un dataset en source de mon DataGridview
    '... et pour effet d'activer le code DG_DatasourceChanged !
     
    ...
    Or,
    -l'event combo_SelectedIndexChanged a pour effet de modifier la datasource du DG
    -l'event DG_datasourceChanged a pour effet de modifier la source des champs de mon form principal.

    Bref, on constate que, avant que tout le formulaire soit chargé, le code est amené à appeler des procédures Events qui interagissent entre elles un certain nombre de fois avant stabilisation.

    Dans les méandres de ces interactions en phase initialisation, il y a un moment où l'un des contrôles n'est pas "prêt" pour être traité, ce qui provoque mon message d'erreur.

    J'ai trouvé donc une solution mais je ne la trouve pas forcément très orthodoxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private form_load...
    init = true
    ....
    init = false
    end sub
    Puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private DG_DataSourceChanged...
    If init then 
    ' code pour gérer l'événement
    EndIf
    Idem pour les autres événements. Ainsi, mon form va au bout de son code "load" sans activer les procédures Events.

    Ca règle déjà pas mal de problème et évite la perte de temps au démarrage du form, certes imperceptibles à l'utilisateur, dû au fait que le code enchaîne des procédures et fonctions de traitement de données, au mieux pour rien, et au pire en générant des erreurs car tous les contrôles ne sont pas initialisés.

    Que pensez-vous de cette méthode ? N'existe-t-il pas une instruction qui permet de ne pas tenir compte des events ?

    Enfin, pour revenir à la cause ultime de mon msgbox, j'ai découvert que l'erreur est déclenché en effet par l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.DG.currentRow.selected = true
    lorsque le DG n'a aucune Row (c'est le cas lorsque mes critères de recherches aboutissent à un tableau vide).
    Cette erreur est donc normale.
    Ce qui l'est moins, c'est que le code va chercher une procédure try/catch située dans une autre sub pour afficher l'exception. Cà, je ne me l'explique toujours pas. Si vous avez une explication à proposer ça m'intéresse.

    Toujours est-il que j'ai donc intégré cette ligne dans une nouvelle procédure Try où le catch prévoit une procédure particulière lorsque Me.DG.CurrentRow = nothing.

    J'ai donc résolu mon problème grâce à votre aide.

    Je passe le sujet en résolu, mais si vous pouvez m'apporter votre avis sur les 2 questions ci-dessus, je vous en serais très reconnaissant.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par noftal Voir le message
    En clair, avant même d'arriver au bout de l'Event Form_load, les Events associés à certains contrôles sont activés alors que cela n'a pas de sens.
    Ca n'a peut etre pas de sens pour toi, mais ca en a pour le reste du monde ...
    l'event form_load n'est qu'un évènement comme un autre, ce n'est pas plus un évènement d'initialisation qu'un autre, d'ailleurs il est préférable d'utiliser le sub new pour l'initialisation, mais le problème restera le même
    il y a une certaine mécanique, il serait aberrant de retirer cette mécanique pendant tel instant
    le framework est en grande partie codé en .net, avec donc des raisevent dans certaines propriétés

    il y a autre méthode que le booléen init qui ne marche pas partout mais qui est préconisable aussi, dans une sub, on teste toujours au début que l'exécution peut se faire
    on ne va pas faire directement telleinstance.telleméthode, on peut vérifier avant if telleinstance is nothing then exit sub
    tout comme avant de lire un fichier on peut vérifier qu'il existe


    concernant les exceptions, si une exception se produit dans une sub n'ayant pas de try catch, l'exception remonte à la sub appelante etc...
    si aucun try catch n'est trouvé l'erreur est affiché dans vs, et ca plante hors vs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/09/2007, 10h38
  2. Réponses: 2
    Dernier message: 09/09/2007, 14h25
  3. Réponses: 8
    Dernier message: 04/06/2007, 16h20
  4. Réponses: 24
    Dernier message: 01/06/2007, 09h26
  5. Réponses: 8
    Dernier message: 11/07/2006, 17h27

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