none
Form d'attente de chargement RRS feed

  • Question

  • Bonjour,

     

    j'ai une application VS2005 qui contient des forms windows dont les composants (datagrid,combobox....) sont liés à des tables d'une dataset qui se chargent dans le load de la form

     

    Ce fait produit un retarde du chargement de la form lors de son appel,

     

    Je voudrais demander si qq'un a une idée pour détourner ceci, une form d'attente "charger...." par exemple, et comment écrire le code d'une façcon dont la form n'apparait que lorsque tous les composants sont remplis par les données et stables,j'en serais trés reconnaissant,,

     

     

    Merci d'avance

    mercredi 8 octobre 2008 17:24

Toutes les réponses

  • Bonjour,

     

    Tout dépend où vous faites un appel à la méthode Fill(), pour remplir votre DataSet.

    En supposant que le remplissage des DataSet se fasse au niveau du constructeur.

    Dans le constructeur de cette fenêtre, vous instanciez et affichez une fenêtre d'attente :

     

    Code Snippet

    private FormAttente frmAttente;

     

    public Fenetre()

    {

    frmAttente = new frmAttente();

    frmAttente.Show();

     

    InitializeComponent();

     

    RemplirDataSet();

    }

     

     

    Et dans le traitement de l'événement "Load" de la fenêtre, vous fermez la fenêtre d'attente.

     

    Code Snippet
    frmAttente.Close();

     

     

     

    Si vos DataSet mettent énormément de temps à se charger, cela dénote un gros défaut de conception dans votre application. Votre base de données n'est peut être pas optimisé, vous rappatriez trop de données... etc.

     

    Cordialement

     

     

    jeudi 9 octobre 2008 09:31
    Modérateur
  • Bonjour,

    Merci Mr Gilles,

     

    En effet, la dataset se remplit effectivement avant le load de la forme

    Mais le problème est qu'à l'appel de la form, elle est jelée pendant pas mal de secondes avant que les composants liés aux données (datagrid surtout, combobox) ne soient stable,

    Y a t il une façon pour détourner cette gelations, j'ai entendu parler du backGrounderWorker, je ne sais pas si ca serait utile,,

     

    Merci d'avance,,

    jeudi 9 octobre 2008 12:27
  • Bonjour,

     

    Vous pouvez utiliser aussi le BackGroundWorker qui permettra à l'utilisateur d'avoir la main sur l'affichage graphique.

    A noter que le chargement risque d'être plus long (1 seconde de plus).

     

    Est-il possible que vous puissiez nous dire combien de lignes affichez vous dans le DataGridView ?

     

    Cordialement

     

    jeudi 9 octobre 2008 17:56
    Modérateur
  • Bonjour,

    Merci Mr Gilles

     

    J'ai utilisé le backgrounder mais c trop lent,

     

    Toutes les tables du dataset se remplissent au chargement du menu principal de l'application

     

    La DatagridView contient 600 lignes, 12 colonnes

     

    Mais dans une autre form j'ai une autre datagrid qui contient 1200 lignes, 12 colonnes et qui se charge rapidement sans prob ,

     

    Je ne sais pas kes ki est à l'origine du retard de cette form à stabiliser (30 secondes à peu prés), pas de calcul sur les cellules, rien de particulier, la table se charge au démarrage de l'application, et le datagrid y est liée...

     

    Merci d'avance

    jeudi 9 octobre 2008 18:57
  • Bonsoir,

     

    Avez-vous regardé si la console de sortie n'affiche pas des exceptions ?

     

    De combien de DataGridView disposez vous dans votre fenêtre ?

    Est-ce qu'il n'y a pas trop de requête qui sont exécuté ?

    N'avez vous pas du code qui est executé 1200 fois ou un truc de ce genre ?

     

    Cordialement

     

    jeudi 9 octobre 2008 20:15
    Modérateur
  • Bonjour,

    Merci Mr.Gilles.

     

    Voici le code du LOAD de la form

     

    Private Sub liste_stock_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     

    Me.MdiParent = My.Forms.Menu

     

    d1.DataSource = dset.Tables("stock_produit")

    d1.ReadOnly = True

     

    End Sub

     

     

    Il y a une seule datagridview dans la form "d1"

    La table "stock_produit" est déjà remplie avant l'ouverture de la form

    Il n'y a aucune requête qui s'exécute

    Il n'y a pas du code qui se boucle plusieurs fois

     

    Merci d'avance
    vendredi 10 octobre 2008 09:43
  • Bonjour,

     

    Avez-vous essayé de mettre le code :

    Code Snippet

    d1.DataSource = dset.Tables("stock_produit")

     

     

    Dans le constructeur de votre Form ?

     

    Cordialement

    vendredi 10 octobre 2008 14:16
    Modérateur
  • Bonjour,

    Merci pour votre réponse,

     

    Je ne sais pas ou plcaer cette ligne de code, ou se trouve le constructeur de la form?? Pouvez vous m'aider plus svp??

     

    Merci d'avance

    vendredi 10 octobre 2008 15:19
  • Bonjour,

     

    C'est la méthode suivante dans votre Form :

     

    Public Sub New()

    'Code du constructeur de la forme

    End Sub

     

    Cordialement

    vendredi 10 octobre 2008 21:01
    Modérateur
  • Bonjour

     

    Voilà , j'ai placé la ligne dans le constructeur, toujours le mm retard, rien n'est changé

     

    Public Sub New()

    ' Cet appel est requis par le Concepteur Windows Form.

    InitializeComponent()

    d1.DataSource = dset.Tables("stock_produit")

    ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().

    End Sub

     

     

    Merci Mr Gilles

    samedi 11 octobre 2008 09:37
  • Bonjour,

     

    Avez vous essayé de déboguer pour voir si l'execution de la requête et le chargement du DataSet n'est pas à l'origine de ce retard ?

    Essayez de voir combien prend de temps la ligne suivante :

     

    Code Snippet
    TableAdapter.Fill(MonDataSet).

     

     

    Cordialement

     

    mardi 14 octobre 2008 20:39
    Modérateur
  • Bonjour Mr Gilles

    Ravi d'avoir répondre !

     

    le code : TableAdapter.Fill(MonDataSet) ne prend que'une seule seconde, c vraiment rapide, et je l'ai bien testé

     

    Le problème réside totalement dans l'affichage du datagridview ou bien de la form car le dataset est déjà rempli dans le load d'un menu général de l'application sa,s problème,c à partir du click sur le boutton appelant la form ou commence le retard et le bloquage

     

    Merci d'avance ,

     

     

    mercredi 15 octobre 2008 09:22
  • Bonjour,

     

    Dans ce cas, il est conseillé d'utiliser le DataGridView en mode "paginé" (VirtualMode = True).

    Il faut traiter alors l'événement CellValueNeed afin de remplir les cellule du DataGridView "à la demande".

     

    Pour plus d'informations :

    http://msdn.microsoft.com/fr-fr/library/15a31akc(VS.80).aspx

     

    Cordialement

    mercredi 15 octobre 2008 21:27
    Modérateur
  • Bonjour

    Mr Gilles merci pour votre proposition, mais je ne souhaite pas mettre la grid en mode paginé,

    J'apprécirais tout de meme une form d'attente qui patiente l'utilisateur en attendant que la form se charge et prend sa forme finale

     

    Merci Beaucoup

    vendredi 24 octobre 2008 16:20
  • Bonjour,

     

    La solution proposée dans mon premier post ne fonctionne pas ?

     

    Cordialement

     

    dimanche 26 octobre 2008 09:06
    Modérateur
  • Bonjour,

     

    Il parait que le bloquage et géle de la form sont les mm toujours, pas de changement

     

    Merci d'avance.........

    dimanche 26 octobre 2008 15:01
  • Bonjour,

     

    Il faut dans ce cas utiliser un BackgroundWorker pour charger votre DataSet. Cela ne devrait plus geler l'affichage.

     

    Cordialement

    dimanche 26 octobre 2008 18:06
    Modérateur
  • Bonjour

     

    Merci Mr Gilles pour votre coopération

    Je souhaiterais une dernière fois que vous m'aidez à utiliser le backgroundworker

     

    Alors, en détail, je vais exposer ce que j'ai dans ma form

     

    Je rappelle, le géle est issue de chargement d'une datagrid à parit d''une table d'un dataset

     

    je ne sais pas exactement comment utiliser le bgw pour détourner le géle :

     

    1-donc au LOAD de la form, une form d'attente doit etre déclenchée et la principale form doit devenir invisible???

     

    2-Comment dire au bgw quand il doit afficher la form d'attente et quand il va varendre la form praincipale visible aprés que le datagrid soit bien chargé et prés graphiquement ??

     

    Si vous pouvez me donner les grands lignes , j'en serait trés reconnaissant...

     

    Encore une fois Meric d'avance.....

     

    dimanche 26 octobre 2008 18:47
  • Bonjour,

     

    Mr Gilles, J'ai du mal à utiliser le BackGroundWorker

     

    Je ne sais pas ou le placer, dans la mm form? dans le menu général?

     

    J'ai essayé mais toujours il y a des exceptions de thread "Mode STA, ce n'est pas le mm thread que la form utilise...."

     

    Prière de me donner un coup de main

     

    Merci d'avance

    jeudi 30 octobre 2008 10:27
  • Bonjour,

     

    Il faut :

    • Mettre le BackGroundWorker dans la fenêtre contenant le DataSet à charger.
    • Traiter l'évènement DoWork et mettez-y le code qui rempli le DataSet.
    • Dans le constructeur de la fenêtre (après l'appel à InitializeComponent()) : Appelez la méthode RunWorkerAsync().

    Cordialement

    jeudi 30 octobre 2008 18:11
    Modérateur
  • Bonjour Mr Gilles

     

    Merci pour l'interet que vous portez,,

     

    Je vais exposer tout le probléme une nouvelle fois:

     

    L'application est une MDI

     

    Le dataset se charge dés le début de l'application dans le Menu général

     

    J'ai une form "Stock" qui contient une datagrid "d" liée à une datatable du dataset

     

    Le problème est qu'à l'appel de la form "stock" , l'affichage géle à cause de la liaison entre le datagrid et le datatable

     

    Pour contourner ce problème vous m'avez proposé le bgw

     

    Ce que je souhaite faire est qu'à l'appel de la form "stock", une form d'attente quelconque s'affiche et ne se ferme que lorsque le datagrid "d"  et la form "stock" est bien prés

     

    J'ai essayé d'utiliser le bgw mais c compliqué , des exeptions se lévent tjs

     

    Prière de m'orienter et de me donner une idée

     

    Merci d'avance

     

     

     

    vendredi 31 octobre 2008 11:48
  • Bonjour,

     

    Il n'existe pas de solution pour ce que vous souhaitez faire.

     

    Cordialement

    vendredi 31 octobre 2008 12:06
    Modérateur
  • Bonjour,

    Mr Gilles, Merci pour votre coopération

     

    Mr Biche,

    Ce que j'ai pu conclure de cette convertation est que je dois travailler avec de nouveaux élements créés par le nouveau thread du BGW ,

    C Bon, mais je n'ai pas pu en tirer profit malheureusement, je ne sais pas ou et comment lier le datagrid de ma form créeépar le 1 er thread avec la nouvelle datagrid crée dans la méthoe runascwork() du BGW avec le 2eme thread

     

    En tout cas , merci beaucoup

    samedi 1 novembre 2008 17:34
  • Bonjour,

     

    Pourquoi ne pas utiliser un écran de démarrage (SplashScreen) qui resterai affiché à l'écran jusqu'à la fin du chargement soit des tables du dataset, soit des datagrid/datagridview ?

    http://msdn.microsoft.com/fr-fr/library/bfkbc5a3(VS.80).aspx

    Le chargement des données serait effectué au niveau de l'écran de démarrage ( en utilisant par exemple des variables déclarées en public static dans une classe ell aussi en public static donc accessibles partout dans l'application )

    Tout ce qui peut être fait avec VB peut aussi se faire en VC# ( il est dommage que le SplashScreen soit fourni avec VB Express et pas avec VC# Express, idem pour l'écran de connexion, un oubli désagréable ...)

     

    Bonne journée

     

    samedi 15 novembre 2008 11:51
  • Bonjour,

     

    J'ai déjà utilisé le splach secreen et j'y cahrge le dataset, pas de problème, pas de géle

    Mais quand j'appelle ma form c'est là ou lil y a du géle à cause de la liaison d'une datagrid avec une datatable

     

    Merci,

     

    samedi 15 novembre 2008 12:56
  • Bonjour,

     

    Vous pouvez avoir un problème de taille de données ( et de type de données )

    1200 lignes avec 12 champs de 5 caractères ( tous String ) : ce n'est pas génant

    600 lignes avec 5 champs dont 3 numériques et un nvarchar(MAX) avec au minimum 10 000 caractères : vous risquez que l'affichage soit très long ( 60 000 000 caractères à stocker dans vôtre mémoire , ce n'est pas instantané et vous risquez d'être obligé de "swapper", c'est-à-dire de stocker vos résultats sur disque avant de pouvoir finir l'affichage de vôtre datagridview...)

     

    Bonne journée 

     

    samedi 15 novembre 2008 15:27