[C# / Winforms] Probleem met het laden van een UserControl

Pagina: 1
Acties:

  • DakuGosuto
  • Registratie: December 2003
  • Laatst online: 25-04 21:01
Het IDE dat ik gebruik is SharpDevelop 1.0.3

Ik heb een programma waarin ik met een menu gebruik maak van UserControls dit menu (bestaande uit linklabels) is onderverdeeld in een aantal categorieen.

Voorbeeld:

Hoofdmenu
Categorieen
Keuze 1
Keuze 2

enzovoorts...

Ik gebruik de volgende code om mijn controls te laden:
		public void LoadControl(Control control)
		{
			MainForm mainForm = (MainForm)ParentForm;
			mainForm.menupanel.Controls.Clear();
			control.Dock = DockStyle.Fill;
			mainForm.menupanel.Controls.Add(control);			
		}


Als ik een UserControl wil laden gebruik ik de volgende code:
                  LoadControl(new Keuze1.MenuControl());

Als ik in het menu van Keuze 1 zit en ik wil naar het menu van Keuze 2 word mijn applicatie wit.
Ik kan zelf de fout niet vinden en mijn IDE geeft geen fout aan ook geen runtime error.

Mocht het nodig zijn kan ik je de source toesturen.

Alvast Bedankt

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Waar kom je uit als het hem op dat moment breakt?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Je beschrijving is wat kort, maar als ik het zo zie roep je LoadControl vanuit een functie aan. Hierdoor is de new Keuze1.MenuControl() slechts beperkt tot de scope van die functie en zal dus bij het verlaten daarvan ook weer vernietigd worden :P

edit:

of de mainForm.menupanel.Controls.Add(control) moet weer een refernce naar dit nieuwe object opslaan...

[ Voor 23% gewijzigd door riezebosch op 24-01-2005 11:07 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

riezebosch schreef op maandag 24 januari 2005 @ 11:05:
Je beschrijving is wat kort, maar als ik het zo zie roep je LoadControl vanuit een functie aan. Hierdoor is de new Keuze1.MenuControl() slechts beperkt tot de scope van die functie en zal dus bij het verlaten daarvan ook weer vernietigd worden :P
Onwaar ben ik bang. Standaard moet een programmeur ZELF objecten "vernietigen", maar in het geval van een automagische garbagecollector, door je control te Add()-en, maak je een referentie naar het object, dus zal het niet "vernietigd" worden, totdat de ControlList "vernietigd" wordt.

Het vage lijkt me hier de Controls.Clear(). Waarom leeg je de ControlList?

edit: hmmz... je edit sneller als ik post :)

[ Voor 7% gewijzigd door MLM op 24-01-2005 11:09 ]

-niks-


  • DakuGosuto
  • Registratie: December 2003
  • Laatst online: 25-04 21:01
@ Questa

Met sharpdevelop kan ik hem niet breaken..... |:(

@riezebosch

Ik gebruik alleen usercontrols deze laad ik elke keer opnieuw bij elk usercontrol heb ik de functie ingevoegd dan laad ik de usercontrols met de code loadcontrol(new keuzebla());

@MLM
Ik clear de panels om ervoor te zorgen dat er niet een aantal controls op elkaar plaatsen aangezien elk control verschillend is(van het menu dan)

Ik ben nog niet heel erg lang bezig met C# dus het vakjargon is nog een beetje wazig voor me heb wel een aantal ebooks die ik langzaam doorwerk als je misschien een beknopte uitleg kan geven:

ControlList
Object(was dit niet gewoon alles wat je plaatst op een form)
garbagecollector
scope(dit is toch tot waar de variable geldig is eg. public private)

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
• ControlList moet ControlCollection zijn in C# dan. Dit is de lijst waarin bijvoorbeeld een form bijhoudt welke controls hij heeft.

• Object is het hoogste niveau in de hiërarchie. Alles is uiteindelijk afgeleid van het Object. Ook Controls dus.

• De GarbageCollector is een soort vuilniswagen die om de zoveel tijd door het geheugen van je programma loopt, en controleert welke objecten geen verwijzingen naar zich hebben (vanuit andere objecten). Als dit niet het geval is, is het object toch niet meer benaderbaar vanuit je programma, en zal het geheugen die dit object inneemt weer vrijgegeven worden.

• Scope is idd het gebied waarin een variabele geldig is. Een lokale variabele is dus alleen geldig binnen die functie waarin ie aangemaakt is. Is die functie afgelopen, dan zal het object weer vernietigd worden. Ik dacht in eerste instantie dat dit het probleem was, omdat je wel een object aanmaakt met new, maar nergens een verwijzing/reference naar dit object opslaat (in een variabele die niet verloren gaat bij het einde van de scope of een lijst (met variabelen)). Maar zoals MLM aangeeft stop je in de functie LoadControl je variabelen in de lijst, waardoor er dus een reference naar dat object blijft bestaan en hij ook niet verwijderd zal worden door de GC (GarbaceCollector).

Je eigenlijke probleem is denk ik de DockingStyle, omdat wanneer je ze allemaal op Fill zet ze elkaar allemaal zullen overlappen. Alle objecten zullen de maximale ruimte innemen die overblijft. En aangezien je geen andere objecten een andere DockingStyle dan None geeft, is dat je complete Form.

[ Voor 11% gewijzigd door riezebosch op 24-01-2005 15:39 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • DakuGosuto
  • Registratie: December 2003
  • Laatst online: 25-04 21:01
Lijkt me niet dat de DockStyle het probleem is omdat ik het panel altijd Clear voordat er een nieuw control ingeplaatst word
public void LoadControl(Control control)
{
MainForm mainForm = (MainForm)ParentForm;
[b]mainForm.menupanel.Controls.Clear();[/b]
control.Dock = DockStyle.Fill;
mainForm.menupanel.Controls.Add(control);
}


Dus niks overlapt elkaar elke keer zal het panel gecleared worden waardoor het terug gaat naar zijn originele status

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Wat is ParentForm voor variabele, en waar komt die vandaan? Wat is Keuze1 voor object en wat wordt er geretourneerd door Keuze1.MenuControl()? Waarom heb je gekozen voor DockStyle.Fill, en voeg je 1 element toe of meerdere? (Ik begrijp uberhaupt niet wat je precies wilt doen).

Je kan ook de tag [ code=C#] ... [ /code] gebruiken ipv pre :P

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • DakuGosuto
  • Registratie: December 2003
  • Laatst online: 25-04 21:01
C#:
1
2
3
4
5
6
7
public void LoadControl(Control control)
    {
        MainForm mainForm = (MainForm)ParentForm;
        mainForm.menupanel.Controls.Clear();
        control.Dock = DockStyle.Fill;
        mainForm.menupanel.Controls.Add(control);
    }

Dit is mij uitgelegd door een vriend van mij, eerst wouden we gewoon Parent gebruiken maar om de een of andere reden deden de usercontrols het dan niet dus is het parentform geworden.
Keuze1 is een mapje(simpelweg gewoon een stuk van de namespace) doet voor de rest niks.
Keuze1.MenuControl()) is het Menu wat hij moet laden en als je dus klikt op de linklabel die erbij hoort leegt hij eerst het hele panel dan laadt hij het menutje daarin en dan filled hij het.
Ik gebruik DockStyle.Fill zodat alles gewoon zo komt te staan als ik wil.

Ik voeg 1 menucontrol(UserControl) toe en 1 HeaderControl(Headertje Text erin)(als element iets anders betekend post het ff 8)7).

en dat van die code ik had de posting guidelines gelezen maar daar stond geen C# bij
Modbreak:Even een klein stukje van de post weg gehaald :) Als je expliciet gaat vragen of mensen je op MSN kunnen toevoegen om problemen op te lossen, dan vervalt het nut van een publieke discussie, heeft het topic geen waarde meer voor anderen en kan het topic net zo goed dicht :)

[ Voor 16% gewijzigd door gorgi_19 op 25-01-2005 13:49 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Ik neem aan dat die LoadControl gewoon in de class van je MainForm staat? Dan kan je natuurlijk ook gewoon this.menupanel.Controls.Add(control) doen.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • DakuGosuto
  • Registratie: December 2003
  • Laatst online: 25-04 21:01
Nope hij staat in elk userControl, maar ook op het mainform. Maar ik moet hem toch bij elk usercontrol bijplaatsen anders werkt het sowieso niet wat ik vreemd vind omdat het toch een public scope heeft.
Pagina: 1