OVH Cloud OVH Cloud

UserControl en WinForm : Libération des ressources non utilisées ?

5 réponses
Avatar
digging
Bonjour,
Pour reprendre un échange très intéressant que j'ai suivi ici, voici
mon problème, simple, mais je sens que je loupe le coche qlq part. J'ai
une interface à la OutLook avec son armée de boutons à gauche et un
panel à droite où je charge dynamiquement des userControls :
panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);
panelBaseIhm.ResumeLayout();
Jusque là aucun souci, mon user machin arrive bien. Mais si j'en charge
un autre, rien ne me dit que le premier a été viré de la collection
Controls du panel ?
Je me dis donc naturellement que je vais t'y mettre un bouton
'btnFermer' à mon userControl et y mettre un code du genre :
this.Dispose();
Et beh, ça marche pas des masses. Quand j'ai cliqué sur plusieurs
boutons et donc chargé dynamiquement plusieurs userControls, il y a un
problème. L'application se bloque et me signale qu'une référence est
inexistante ou que je fais référence à un objet inexistant.

Ma question, quel 'bon' bout de code il faut mettre dans le bouton
'btnFermer' de mon userControl pour lui dire que je veux plus de lui et
qu'il s'en aille ? Avec un WinForm, j'aurai fais "this.Close();" et le
reste est automatique, mais comment dire au userControl "Foue le camp
t'es une pouffiasse " ?

S'il y a une bonne âme pour me sortir de ce merdier où je le suis
fourré !
Sincèrement
digging

--
- concepteur ensemblier -

5 réponses

Avatar
Paul Bacelar
"digging" wrote in message
news:
Bonjour,
Pour reprendre un échange très intéressant que j'ai suivi ici, voici
mon problème, simple, mais je sens que je loupe le coche qlq part. J'ai
une interface à la OutLook avec son armée de boutons à gauche et un
panel à droite où je charge dynamiquement des userControls :
panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);
panelBaseIhm.ResumeLayout();
Jusque là aucun souci, mon user machin arrive bien. Mais si j'en charge
un autre, rien ne me dit que le premier a été viré de la collection
Controls du panel ?
Je me dis donc naturellement que je vais t'y mettre un bouton
'btnFermer' à mon userControl et y mettre un code du genre :
this.Dispose();
Et beh, ça marche pas des masses. Quand j'ai cliqué sur plusieurs
boutons et donc chargé dynamiquement plusieurs userControls, il y a un
problème. L'application se bloque et me signale qu'une référence est
inexistante ou que je fais référence à un objet inexistant.

Ma question, quel 'bon' bout de code il faut mettre dans le bouton
'btnFermer' de mon userControl pour lui dire que je veux plus de lui et
qu'il s'en aille ? Avec un WinForm, j'aurai fais "this.Close();" et le
reste est automatique, mais comment dire au userControl "Foue le camp
t'es une pouffiasse " ?

S'il y a une bonne âme pour me sortir de ce merdier où je le suis
fourré !
Sincèrement
digging

--
- concepteur ensemblier -




Pourquoi un bouton?

<CODE>

ControlCollection controlCollection (ControlCollection)panelBaseIhm.Controls.Clone;

panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);

foreach(Control control in controlCollection ){
control.Dispose(true);
}

panelBaseIhm.ResumeLayout();

</CODE>

--
Paul Bacelar
Avatar
digging
Après mure réflexion, Paul Bacelar a écrit :
"digging" wrote in message
news:
Bonjour,
Pour reprendre un échange très intéressant que j'ai suivi ici, voici
mon problème, simple, mais je sens que je loupe le coche qlq part. J'ai
une interface à la OutLook avec son armée de boutons à gauche et un
panel à droite où je charge dynamiquement des userControls :
panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);
panelBaseIhm.ResumeLayout();
Jusque là aucun souci, mon user machin arrive bien. Mais si j'en charge
un autre, rien ne me dit que le premier a été viré de la collection
Controls du panel ?
Je me dis donc naturellement que je vais t'y mettre un bouton
'btnFermer' à mon userControl et y mettre un code du genre :
this.Dispose();
Et beh, ça marche pas des masses. Quand j'ai cliqué sur plusieurs
boutons et donc chargé dynamiquement plusieurs userControls, il y a un
problème. L'application se bloque et me signale qu'une référence est
inexistante ou que je fais référence à un objet inexistant.

Ma question, quel 'bon' bout de code il faut mettre dans le bouton
'btnFermer' de mon userControl pour lui dire que je veux plus de lui et
qu'il s'en aille ? Avec un WinForm, j'aurai fais "this.Close();" et le
reste est automatique, mais comment dire au userControl "Foue le camp
t'es une pouffiasse " ?

S'il y a une bonne âme pour me sortir de ce merdier où je le suis
fourré !
Sincèrement
digging

--
- concepteur ensemblier -




Pourquoi un bouton?

<CODE>

ControlCollection controlCollection > (ControlCollection)panelBaseIhm.Controls.Clone;

panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);

foreach(Control control in controlCollection ){
control.Dispose(true);
}

panelBaseIhm.ResumeLayout();

</CODE>



Merçi Paul,
J'essaye ce bout de code et te tiens au courant.
digging

--
- concepteur ensemblier -
Avatar
digging
Dans son message précédent, Paul Bacelar a écrit :
"digging" wrote in message
news:
Bonjour,
Pour reprendre un échange très intéressant que j'ai suivi ici, voici
mon problème, simple, mais je sens que je loupe le coche qlq part. J'ai
une interface à la OutLook avec son armée de boutons à gauche et un
panel à droite où je charge dynamiquement des userControls :
panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);
panelBaseIhm.ResumeLayout();
Jusque là aucun souci, mon user machin arrive bien. Mais si j'en charge
un autre, rien ne me dit que le premier a été viré de la collection
Controls du panel ?
Je me dis donc naturellement que je vais t'y mettre un bouton
'btnFermer' à mon userControl et y mettre un code du genre :
this.Dispose();
Et beh, ça marche pas des masses. Quand j'ai cliqué sur plusieurs
boutons et donc chargé dynamiquement plusieurs userControls, il y a un
problème. L'application se bloque et me signale qu'une référence est
inexistante ou que je fais référence à un objet inexistant.

Ma question, quel 'bon' bout de code il faut mettre dans le bouton
'btnFermer' de mon userControl pour lui dire que je veux plus de lui et
qu'il s'en aille ? Avec un WinForm, j'aurai fais "this.Close();" et le
reste est automatique, mais comment dire au userControl "Foue le camp
t'es une pouffiasse " ?

S'il y a une bonne âme pour me sortir de ce merdier où je le suis
fourré !
Sincèrement
digging

--
- concepteur ensemblier -




Pourquoi un bouton?

<CODE>

ControlCollection controlCollection > (ControlCollection)panelBaseIhm.Controls.Clone;

panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);

foreach(Control control in controlCollection ){
control.Dispose(true);
}

panelBaseIhm.ResumeLayout();

</CODE>



Ok, j'ai regardé attentivement ce que fait le bout de code que tu m'a
envoyé. Il me permet de libérer effectivement TOUTES les ressources de
mon panel.
En fait ce que je voudrais faire est ceci :
1. Quelque part dans un menu, je charge un userControl dans mon panel
panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);

foreach(Control control in controlCollection ){
control.Dispose(true);
}

panelBaseIhm.ResumeLayout();
2. Depuis le userControl chargé, ici uc111e, j'en charge un autre pour
effectuer une mise à jour, tout en masquant le premier, etc (rappel
nous sommes en WinForm) :
uc111e.hide();
panelBaseIhm.SuspendLayout();
UserControl222e uc222e = new UserControl222e();
uc222e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc222e);
3. Sur uc222e, j'ai bouton "Validation" qui me fait mon Update. Ce que
je voudrais, c'est qu'après la validation, uc222e foutte le camp, il a
fini son travail, et que uc111e se montre :
- uc222e a fini son job, libère SES propres ressources et se casse !
- uc111e.show();

Voilà toute ma problématique étape par étape.
Je suis coincé et n'arrive pas à avancé. Certes en ASPNET c'est
automatique, mais là je suis en WinForm.
Merçi par avance.

--
- concepteur ensemblier -
Avatar
Paul Bacelar
"digging" wrote in message
news:
Dans son message précédent, Paul Bacelar a écrit :
> "digging" wrote in message
> news:
>> Bonjour,
>> Pour reprendre un échange très intéressant que j'ai suivi ici, voici
>> mon problème, simple, mais je sens que je loupe le coche qlq part. J'ai
>> une interface à la OutLook avec son armée de boutons à gauche et un
>> panel à droite où je charge dynamiquement des userControls :
>> panelBaseIhm.Controls.Clear();
>> panelBaseIhm.SuspendLayout();
>> UserControl111e uc111e = new UserControl111e();
>> uc111e.Location = new System.Drawing.Point(5, 5);
>> panelBaseIhm.Controls.Add(uc111e);
>> panelBaseIhm.ResumeLayout();
>> Jusque là aucun souci, mon user machin arrive bien. Mais si j'en charge
>> un autre, rien ne me dit que le premier a été viré de la collection
>> Controls du panel ?
>> Je me dis donc naturellement que je vais t'y mettre un bouton
>> 'btnFermer' à mon userControl et y mettre un code du genre :
>> this.Dispose();
>> Et beh, ça marche pas des masses. Quand j'ai cliqué sur plusieurs
>> boutons et donc chargé dynamiquement plusieurs userControls, il y a un
>> problème. L'application se bloque et me signale qu'une référence est
>> inexistante ou que je fais référence à un objet inexistant.
>>
>> Ma question, quel 'bon' bout de code il faut mettre dans le bouton
>> 'btnFermer' de mon userControl pour lui dire que je veux plus de lui et
>> qu'il s'en aille ? Avec un WinForm, j'aurai fais "this.Close();" et le
>> reste est automatique, mais comment dire au userControl "Foue le camp
>> t'es une pouffiasse " ?
>>
>> S'il y a une bonne âme pour me sortir de ce merdier où je le suis
>> fourré !
>> Sincèrement
>> digging
>>
>> --
>> - concepteur ensemblier -
>>
>
> Pourquoi un bouton?
>
> <CODE>
>
> ControlCollection controlCollection > > (ControlCollection)panelBaseIhm.Controls.Clone;
>
> panelBaseIhm.Controls.Clear();
> panelBaseIhm.SuspendLayout();
> UserControl111e uc111e = new UserControl111e();
> uc111e.Location = new System.Drawing.Point(5, 5);
> panelBaseIhm.Controls.Add(uc111e);
>
> foreach(Control control in controlCollection ){
> control.Dispose(true);
> }
>
> panelBaseIhm.ResumeLayout();
>
> </CODE>

Ok, j'ai regardé attentivement ce que fait le bout de code que tu m'a
envoyé. Il me permet de libérer effectivement TOUTES les ressources de
mon panel.
En fait ce que je voudrais faire est ceci :
1. Quelque part dans un menu, je charge un userControl dans mon panel
panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);

foreach(Control control in controlCollection ){
control.Dispose(true);
}

panelBaseIhm.ResumeLayout();
2. Depuis le userControl chargé, ici uc111e, j'en charge un autre pour
effectuer une mise à jour, tout en masquant le premier, etc (rappel
nous sommes en WinForm) :
uc111e.hide();
panelBaseIhm.SuspendLayout();
UserControl222e uc222e = new UserControl222e();
uc222e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc222e);
3. Sur uc222e, j'ai bouton "Validation" qui me fait mon Update. Ce que
je voudrais, c'est qu'après la validation, uc222e foutte le camp, il a
fini son travail, et que uc111e se montre :
- uc222e a fini son job, libère SES propres ressources et se casse !
- uc111e.show();

Voilà toute ma problématique étape par étape.
Je suis coincé et n'arrive pas à avancé. Certes en ASPNET c'est
automatique, mais là je suis en WinForm.
Merçi par avance.

--
- concepteur ensemblier -




Il est toujours très compliqué à un control de s'auto-détruire mais il est
très simple de faire le ménage pour lui.



Il serait logique que uc111e pilote uc222e.

Je te conseil de faire de uc111e un simple panel contenant un ensemble de
contrôle que tu affiches en fonction des besoin.

Par exemple, tu auras dans ton panel, 2 autres usercontrol qui ne seront
jamais affichés (Visible=true) en même temps et qui prendrons l'ensemble de
l'espace du panel englobant.

C'est le constructeur du panel parent qui créera les 2 usercontrols dés le
départ, donc pas de gestion de ressource compliquée car tu auras toujours 2
usercontols au maximum. Et tu utiliseras les évènements fournis par ces 2
usercontrol dans ta classe dérivé d'un panel pour être prévenu des
événements qui engendreront des changements de visibilités des différents
usercontrols.

Avoir un usercontrol parent des 2 autres permet d'avoir une indépendance de
comportement entre les usercontrol fils permettant une meilleur maintenance
et ré-utilisabilité du code.
--
Paul Bacelar
Avatar
digging
Paul Bacelar a exprimé avec précision :
"digging" wrote in message
news:
Dans son message précédent, Paul Bacelar a écrit :
"digging" wrote in message
news:
Bonjour,
Pour reprendre un échange très intéressant que j'ai suivi ici, voici
mon problème, simple, mais je sens que je loupe le coche qlq part. J'ai
une interface à la OutLook avec son armée de boutons à gauche et un
panel à droite où je charge dynamiquement des userControls :
panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);
panelBaseIhm.ResumeLayout();
Jusque là aucun souci, mon user machin arrive bien. Mais si j'en charge
un autre, rien ne me dit que le premier a été viré de la collection
Controls du panel ?
Je me dis donc naturellement que je vais t'y mettre un bouton
'btnFermer' à mon userControl et y mettre un code du genre :
this.Dispose();
Et beh, ça marche pas des masses. Quand j'ai cliqué sur plusieurs
boutons et donc chargé dynamiquement plusieurs userControls, il y a un
problème. L'application se bloque et me signale qu'une référence est
inexistante ou que je fais référence à un objet inexistant.

Ma question, quel 'bon' bout de code il faut mettre dans le bouton
'btnFermer' de mon userControl pour lui dire que je veux plus de lui et
qu'il s'en aille ? Avec un WinForm, j'aurai fais "this.Close();" et le
reste est automatique, mais comment dire au userControl "Foue le camp
t'es une pouffiasse " ?

S'il y a une bonne âme pour me sortir de ce merdier où je le suis
fourré !
Sincèrement
digging

--
- concepteur ensemblier -




Pourquoi un bouton?

<CODE>

ControlCollection controlCollection >>> (ControlCollection)panelBaseIhm.Controls.Clone;

panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);

foreach(Control control in controlCollection ){
control.Dispose(true);
}

panelBaseIhm.ResumeLayout();

</CODE>



Ok, j'ai regardé attentivement ce que fait le bout de code que tu m'a
envoyé. Il me permet de libérer effectivement TOUTES les ressources de
mon panel.
En fait ce que je voudrais faire est ceci :
1. Quelque part dans un menu, je charge un userControl dans mon panel
panelBaseIhm.Controls.Clear();
panelBaseIhm.SuspendLayout();
UserControl111e uc111e = new UserControl111e();
uc111e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc111e);

foreach(Control control in controlCollection ){
control.Dispose(true);
}

panelBaseIhm.ResumeLayout();
2. Depuis le userControl chargé, ici uc111e, j'en charge un autre pour
effectuer une mise à jour, tout en masquant le premier, etc (rappel
nous sommes en WinForm) :
uc111e.hide();
panelBaseIhm.SuspendLayout();
UserControl222e uc222e = new UserControl222e();
uc222e.Location = new System.Drawing.Point(5, 5);
panelBaseIhm.Controls.Add(uc222e);
3. Sur uc222e, j'ai bouton "Validation" qui me fait mon Update. Ce que
je voudrais, c'est qu'après la validation, uc222e foutte le camp, il a
fini son travail, et que uc111e se montre :
- uc222e a fini son job, libère SES propres ressources et se casse !
- uc111e.show();

Voilà toute ma problématique étape par étape.
Je suis coincé et n'arrive pas à avancé. Certes en ASPNET c'est
automatique, mais là je suis en WinForm.
Merçi par avance.

--
- concepteur ensemblier -




Il est toujours très compliqué à un control de s'auto-détruire mais il est
très simple de faire le ménage pour lui.



Il serait logique que uc111e pilote uc222e.

Je te conseil de faire de uc111e un simple panel contenant un ensemble de
contrôle que tu affiches en fonction des besoin.

Par exemple, tu auras dans ton panel, 2 autres usercontrol qui ne seront
jamais affichés (Visible=true) en même temps et qui prendrons l'ensemble de
l'espace du panel englobant.

C'est le constructeur du panel parent qui créera les 2 usercontrols dés le
départ, donc pas de gestion de ressource compliquée car tu auras toujours 2
usercontols au maximum. Et tu utiliseras les évènements fournis par ces 2
usercontrol dans ta classe dérivé d'un panel pour être prévenu des
événements qui engendreront des changements de visibilités des différents
usercontrols.

Avoir un usercontrol parent des 2 autres permet d'avoir une indépendance de
comportement entre les usercontrol fils permettant une meilleur maintenance
et ré-utilisabilité du code.



Paul,
Merçi pour cet conseil éclairé, je vais creuser dans cette direction.
digging

--
- concepteur ensemblier -