Re-dessiner un panel dans un form deja charge [Résolu]

Signaler
Messages postés
54
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
Messages postés
54
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
Salut,
voici mon petit probleme : au debut de mon application je charge un form avec un menu et un grand panel vide. Selon la navigation dans le menu, je souhaite actualiser le panel central avec le panel adapte.
Pourtant quand je clique dans mon menu il ne se passe rien.
J'ai essayer ca :

private void Menu1_Click(object sender, EventArgs e)
        {
            try
            {
                pnlMain = new UserGui(new User());
                this.Refresh();
                this.Show();   
            }
            catch (Exception exc)
            {
                txtDialogBar_frmMainAdmin.Text = exc.GetType()+ "->" + exc.Message;
            }
        }

Je rentre bien dans ma fonction car j'ai teste en y faisant afficher une messageBox mais les Refresh et autre semble sans effet.
Mon User se cree bien egalement car j'arrive a recuperer ses donnees.

Le Refresh et le Show s'adressent au form mais j'ai aussi essayer de le faire sur le panel sans un meilleur resultat. Pourtant ces proprietes devraient me re-dessiner mon form avec tous ses controls dont mon panel !

Comment dois je m'y prendre SVP ?

11 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
En utilisant ce panel :

public class UserPanel : Panel
{
    public UserPanel( ) : base( ) { }



    public void CreateUI( User user )
    {
        this.SuspendLayout( );



        if ( this.Controls.Count > 0 )
            this.Controls.Clear( );



        // Construit la nouvelle apparence du panel.



        this.ResumeLayout( );
    }
}


tu pourras le mette à jour comme ça :



p.CreateUI( new User( ) ); // p est de type UserPanel


ou comme ça :



( ( UserPanel )this.Controls[ "MainPanel" ] ).CreateUI( new User( ) );
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Je suis pas sûr de tout bien comprendre mais..

Ton panel est dans la collection de contrôles de ta forme, ( propriété Controls ) c'est cette reference qu'il  faut modifier.

private void button1_Click( object sender, EventArgs e )
{
    Panel p = new Panel( );
    p.BackColor = Color.Azure;
    // ..


    // MainPanel est le nom du Panel ( propriété Name )
    this.Controls.RemoveByKey( "MainPanel" );
    this.Controls.Add( p );
}
Messages postés
54
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
3 avril 2008

Tu m'a apporte une solution mais qui n'est pas celle que je recherche. Je fais un remove puis un add alors que je voulais rafraichir le panel existant.
La ligne :
this.Controls.RemoveByKey( "MainPanel" );
semble sans effet chez moi ???!!!
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
C'est parce que tu n'as certainement pas de panel s'appelant MainPanel (par appelant, j'entends qui a la property Name="MainPanel")

VC# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
Visiblement, tu devrais mettre "pnlMain" à la place....

VC# forever
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Pourtant j'avais anticipé cette réponse et j'avais donné la précision en commentaire :

<< MainPanel est le nom du Panel ( propriété Name ) >>

Si tu veux rafraîchir le panel dans ce cas la faut pas faire ça :

pnlMain = new UserGui(new User());

mais plutôt modifier la propriété Controls de pnlMain.
Messages postés
54
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
3 avril 2008

Effectivement, j'avais bien fais attention de mettre pnlMain a la place de MainPanel mais la propriete Name n'etait pas definie ! Il etait tard, on va dire ca.(je suis pas en France pour info, il etait vraiment tard).

Par contre, pouvez vous m'expliquer a quoi sert la propriete "RemoveByKey". A ce que j'ai compris, elle enleve le panel du tableau de controls de mon form. Donc elle enleve bien mon panel MainPanel surtout que je fais un add derriere du nouveau.

Je ne peux pas initialiser mon MainPanel avec un autre panel en faisant :
pnlMain = new UserGui(new User());
puis simplement le rafraichir ?

Qu'est ce que tu veux dire par :

Si tu veux rafraîchir le panel dans ce cas la faut pas faire ça :

pnlMain = new UserGui(new User());

mais plutôt modifier la propriété Controls de pnlMain.
Messages postés
54
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
3 avril 2008

Salut,
j'attend desesperement ta reponse Lutinore. J'ai teste ta piste mais franchement je vois pas ce que tu veux dire par modifier la propriete controls de pnlMain.

Tiens moi au courant SVP, c'est un peu bourrin de faire un remove puis un add !
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Tu as deux référence de ton panel. la première pnlMain et une seconde qui se trouve dans la collection de contrôles de ta forme ( elle y est ajoutée automatiquement par VS si tu travail avec le designer. )

Maintenant si tu fais ça :

pnlMain = new UserGui(new User());

pnlMain référence ( pointe ) vers le nouveau UserGui mais la référence qui était contenue dans la collection de contrôles de ta forme ( propriété Controls ) elle, elle référence ( pointe ) toujours vers l'ancien panel et rien n'est modifié visuellement.




Tu peux t'en convaincre avec ce code :

Panel p = new Panel( );
p.Name = "Panel1";



this.Controls.Add( p );



p = new Panel( );
p.Name = "Panel2";



// Les panels ne sont pas les mêmes.
MessageBox.Show( p.Name + " / " + this.Controls[ 0 ].Name );


Par contre si tu modifies directement les propriétes de pnlMain ( genre BackColor, Controls etc.. ) alors là oui visuellement tu verras les modifications.
Messages postés
54
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
3 avril 2008

Salut, merci pour ta reponse.

Je vois ce que tu veux dire. Du coup, au lieu de creer une nouvelle reference, j'ai essayer d'ecraser la premiere (celle de mon MainPanel) comme ceci :
this.Controls[IndicePanel] = new UserGui(new User( ));
UserGui derivant de panel evidemment !
 
Mais la propriété est en lecture seule !!! je me suis faite jeter !

Donc y-a t'il un moyen plus leger que Remove + Add pour modifier une des reference de la collection
Messages postés
54
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
3 avril 2008

Salut Lutinore,

cela me semble une bonne piste, j'ai pas mon code sous les yeux mais je testerai ça dès que possible.
Merci pour ton aide en tout cas, j'espère que j'arriverai à l'adapter car j'ai plusieurs classes différentes dérivées de panel, ... enfin bref c'est pas si simple.