Re-dessiner un panel dans un form deja charge

Résolu
cs_egwene Messages postés 54 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 3 avril 2008 - 3 août 2006 à 14:05
cs_egwene Messages postés 54 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 3 avril 2008 - 5 août 2006 à 06:55
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
4 août 2006 à 19:12
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( ) );
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 août 2006 à 14:29
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 );
}
0
cs_egwene Messages postés 54 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 3 avril 2008
3 août 2006 à 15:08
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 ???!!!
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 août 2006 à 15:13
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
3 août 2006 à 15:34
Visiblement, tu devrais mettre "pnlMain" à la place....

VC# forever
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 août 2006 à 16:12
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.
0
cs_egwene Messages postés 54 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 3 avril 2008
4 août 2006 à 05:20
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.
0
cs_egwene Messages postés 54 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 3 avril 2008
4 août 2006 à 14:16
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 !
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
4 août 2006 à 17:11
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.
0
cs_egwene Messages postés 54 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 3 avril 2008
4 août 2006 à 17:36
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
0
cs_egwene Messages postés 54 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 3 avril 2008
5 août 2006 à 06:55
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.
0
Rejoignez-nous