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 :

Perdu le mode d'affichage Modale d'une fenêtre à cause du BackgroundWorker


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    Par défaut Perdu le mode d'affichage Modale d'une fenêtre à cause du BackgroundWorker
    Bonjour à tous,
    J'ai perdu le mode modale de ma fenêtre d'authentification depuis que j'ai rajouter un BackGroundWorker (pour charger mes données en tache de fond pendant que ma fenêtre principale se charge et dessine ses contrôles).
    Pour une fenêtre d'authentification c'est un peu dommage. Pourtant je lance bien celle-ci en faisant : frmAuthentification.showDialog. Je soupçonne le fait que l'affichage de ma feuille d'authentification fait partie du Thread lancé par le backGroundWorker alors que ma feuille principale se charge et se dessine depuis le Thread Principal.
    En clair il semblerait que les feuilles chargées depuis des Threads indépendants deviennent également indépendante. Je me dit que c'est normal puisque pour qu'une feuille soit modale, elle doit l’être obligatoirement par rapport à une autre sinon ça n'a pas de sens à mon humble avis.

    Les questions que je me pose sont :
    - y a t'il un moyen pour rétablir la modalité de ma feuille dans ce cas ?
    - Ou autres alternatives ? J'ai essayé : me.enabled = false pour désactiver la feuille principale, mais la feuille devient toute grise, je trouve pas ça super.

    Merci si vous pouvez m'aider.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par BasicZX81 Voir le message
    En clair il semblerait que les feuilles chargées depuis des Threads indépendants deviennent également indépendante.
    C'est bien ça

    Il faut que tu fasses le ShowDialog dans le thread principal, et que tu lances le traitement en tâche de fond avant d'afficher le dialogue

  3. #3
    Membre éclairé
    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
    Par défaut
    Bonjour et merci pour la réponse,
    Il faut que tu fasses le ShowDialog dans le thread principal
    Effectivement, j'ai déplacé la partie du code qui lance le ShowDialog dans le Thread principal et j'ai rétablie le fonctionnement modal.
    Par contre, l'interêt du BackgroundWorker à l'origine c'était de voir ma barre de progression sur la feuille principal et la, je ne la vois plus. Il y a un truc qui m'echappe. Actuellement je lance mon BackGroundWorker depuis le load de ma feuille principale, c'est peut-être ça l'erreur ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Là comme ça je vois pas, il faudrait voir le code...

  5. #5
    Membre éclairé
    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
    Par défaut
    Merci de m'aider tomlev, car je commence à être légerement dépassé...
    Ce soir je poste un extrait de code et tout ce qui est nécessaire à la compréhension du problème.

  6. #6
    Membre éclairé
    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
    Par défaut
    Bonsoir, comme prévu voici la structure de mon programme (que j'ai simplifié au maximum pour allégé pour la compréhension) :

    Tout d'abord, quelques réglages dans les propriétés du projet, Onglet Application :
    - Formulaire de démarrage : XProject (fenêtre MDIContainer).
    - Ecran de démarrage : frmSplashScreen.

    Ce qu'il faut savoir :
    - Mon Progressbar se trouve sur la fenêtre principale (XProjet).

    Ensuite mon programme démarre donc sur Xproject_load :
    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
     
    Public Class XProject
    Private Sub XProject_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    ' Les appels des procédures relatives à l'initialisation de la fenêtre principale :
            Me.IsMdiContainer = True
            Call .......etc ' initialisation du Logger, icones, barres d'outils, TreeView...etc
     
    ' Chargement du Setup.ini et Initialisation :
            Call ........etc ' Chargement du SetUp, Initialisation du Dataset, Objets ADO.NET, Connection, Vérification de la base.....etc
     
    ' Initialisation et lancement du BackGroundWorker :
            BackgroundWorker1.WorkerReportsProgress = True
            AddHandler BackgroundWorker1.DoWork, AddressOf LoadData
            AddHandler BackgroundWorker1.ProgressChanged, AddressOf AfficheProgress
            AddHandler BackgroundWorker1.RunWorkerCompleted, AddressOf LoadDataCompleted
     
            BackgroundWorker1.RunWorkerAsync()
     
            Call UsersAuthentification()  ' Affiche frmAuthentification.ShowDialog puis charge le profil Utilisateur
     
        End Sub
     
    ' Le Chargement des données avec les notifications d'avancements :
            Private Sub LoadData()
            BackgroundWorker1.ReportProgress(30, "Chargement de la table Users...")
            Call LoadTablesUsers()
            BackgroundWorker1.ReportProgress(50, "Chargement de la table projets...")
            Call LoadTablesProjets()
            BackgroundWorker1.ReportProgress(70, "Chargement de la table Taches...")
            Call LoadTablesTaches()
            BackgroundWorker1.ReportProgress(100, "Chargement terminé.")
        End Sub
     
    ' La suite des procédures que je n'ai pas pu mettre dans LoadData car les objets qui appartiennent à la fenêtre principale et donc au Thread Principal, ne peuvent pas être manipulés dans le Thread secondaire du BackGroundWorker (Celui-ci ne l'accepte pas !, probablement parceque celui ci est lancé depuis la fenêtre principale ?).
            Private Sub LoadDataCompleted()
    ' Initialisation des contrôles de la fenêtre principale une fois que les données ont été chargés :
            ComboBoxPROJETCOURANT.DataSource = objDBDataSet.Tables(Tables.Projets)
    .....etc
     
            frmProjets.MdiParent = Me
            frmTaches.MdiParent = Me
     
            ToolStripProgressBar1.Visible = False
            ToolStripStatusLabel2.Visible = False
     
            ShowMdiChild(STARTUP_MDIFORM)
    End Sub
     
     
    ' Dans le StatusProgress on affiche l'avancement du BackGroundWorker :
            Private Sub AfficheProgress(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
            Dim message As String = e.UserState.ToString
            ToolStripProgressBar1.Value = e.ProgressPercentage
            ToolStripStatusLabel2.Text = message
        End Sub
    End Class
    Voilà, j'ai largement épuré le code et j'espère que je n'ai pas omis d'informations importantes. En commentaire j'ai mis les informations les plus pertinentes liées à mon problème multiple lié au BackGroundWorker , a savoir :
    - L'Affichage de la fenêtre d'authentification n'est plus modal si j’exécute celle-ci dans le Thread secondaire.
    - La ProgressBar n'est plus visible pendant le chargement (A priori tant que ma fenêtre d'authentification modale n'est pas fermé, je ne peux pas voir ma fenêtre principale et donc ma ProgressBar).

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 08/11/2015, 18h37
  2. Réponses: 3
    Dernier message: 30/06/2011, 10h39
  3. Affichage PDF dans une fenêtre HTML
    Par gbarbier dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/08/2007, 15h20
  4. [c++] Récupérer le mode d'affichage d'une fenêtre
    Par jambono dans le forum Windows
    Réponses: 4
    Dernier message: 23/10/2006, 17h45
  5. Affichage variable dans une fenêtre d'alerte
    Par undercrash dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/03/2006, 21h35

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