Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C# / .NET] ControlCollection door de wa na Controls.Visible

Pagina: 1
Acties:
  • 548 views sinds 30-01-2008
  • Reageer

  • Gwannoes
  • Registratie: Juni 2002
  • Laatst online: 20-11 13:07

Gwannoes

Solderen moet je leren

Topicstarter
Ik zit hier met een probleempje:

Ik heb een Panel (genaamd SchematicPanel), een ToolStrip (knoppenbalk) en een aantal zelfgemaakte UserControls. Op die UserControls staan weer andere controls (buttons,dropdown-boxes, labels)

Bij het initialiseren van het panel doe ik:
C#:
1
2
3
4
5
6
SchematicPanel.Controls.Add(new UserControl1);
SchematicPanel.Controls[0].Visible = false;
SchematicPanel.Controls.Add(new UserControl2);
SchematicPanel.Controls[1].Visible = false;
SchematicPanel.Controls.Add(new UserControl3);
SchematicPanel.Controls[2].Visible = false;

etc... Na het toevoegen van mijn UserControls staan ze netjes in de ControlCollection van het SchematicPanel op volgorde.
Nu wil ik, na het klikken van een button nr. n op de ToolStrip , de bijbehorende UserControl zichtbaar wil maken d.m.v.
C#:
1
SchematicPanel.Controls[n].Visible = true;

Echter gaat (soms; afhankelijk van de volgorde van aanklikken 8)7)na het uitvoeren van deze regel de ControlCollection helemaal door de war: de volgorde van de controls klopt niet meer.

Op internet vond ik deze link waar hetzelfde probleem wordt beschreven, maar ik kan niet snappen wat de oplossing en/of oorzaak is.

Iemand van jullie raad?

Hmmz, hier komt dus m'n sig


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Waarschijnlijk moet je niet vertrouwen op de order in een ControlCollection, aangezien die ook van invloed is op de Z-order van het control. Zelfs het op deze manier toevoegen en invisible maken van je controls lijkt me niet helemaal dé manier. Doe dat door het control zelf invisible te maken ipv vanuit de referentie uit je ControlCollection (dus niet de new UserControl in de Add functie rechtstreeks), of met een for-loopje aan het eind doen.

Denk dat je het beste een referentie naar het bijbehorende usercontrol op kan nemen in de button op je toolstrip.

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


  • Gwannoes
  • Registratie: Juni 2002
  • Laatst online: 20-11 13:07

Gwannoes

Solderen moet je leren

Topicstarter
Hmm, inderdaad blijkt die volgorde niet te vertrouwen. Ik heb het nu opgelost door bij elke UserControl een index in UserControl.Tag te zetten, en deze is gekoppeld aan de ToolStripButton. (zoals riezebosch dus ook al schrijft.)
Maar ik blijf het een vreemde situatie vinden, dat de ControlCollection zichzelf gaat hersorteren doordat ik een property van één van z'n items aanpas. 8)7

Hmmz, hier komt dus m'n sig


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Gwannoes schreef op dinsdag 29 januari 2008 @ 15:32:
Hmm, inderdaad blijkt die volgorde niet te vertrouwen. Ik heb het nu opgelost door bij elke UserControl een index in UserControl.Tag te zetten, en deze is gekoppeld aan de ToolStripButton. (zoals riezebosch dus ook al schrijft.)
Maar ik blijf het een vreemde situatie vinden, dat de ControlCollection zichzelf gaat hersorteren doordat ik een property van één van z'n items aanpas. 8)7
Waarschijnlijk dat de visibility van een item van invloed is op z'n Z-order welke weer van invloed is op z'n positie in de collectie.

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


  • Gwannoes
  • Registratie: Juni 2002
  • Laatst online: 20-11 13:07

Gwannoes

Solderen moet je leren

Topicstarter
riezebosch schreef op dinsdag 29 januari 2008 @ 16:25:
[...]

Waarschijnlijk dat de visibility van een item van invloed is op z'n Z-order welke weer van invloed is op z'n positie in de collectie.
Als ControlCollection een gewone ArrayList zou zijn (en dat is het niet, maar daar lijkt hij wel wat op), dan zou de ArrayList het wel even uit z'n hoofd moeten laten met z'n tengels aan de volgorde van m'n controls te komen! Ik blijf het merkwaardig vinden...

Hmmz, hier komt dus m'n sig


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Jij moet gewoon niet afgaan op de impliciete volgorde.
Tenzij er expliciet beschreven staat dat een Add() op het einde toevoegt, mag je er niet op afgaan dat het zo is.

Bovendien is het qua netheid in je code ook niet proper om eerst Add(new X) te doen en dan indexeren in de container om hetzelfde object te wijzigen.

ASSUME makes an ASS out of U and ME


  • Ruudjah
  • Registratie: November 1999
  • Laatst online: 06-09 20:58

Ruudjah

2022

DIT BERICHT IS PREVENTIEF VERWIJDERD DOOR DE GEBRUIKER

[ Voor 95% gewijzigd door Ruudjah op 01-12-2009 22:22 ]

TweakBlog


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Gwannoes schreef op dinsdag 29 januari 2008 @ 15:32:
Hmm, inderdaad blijkt die volgorde niet te vertrouwen. Ik heb het nu opgelost door bij elke UserControl een index in UserControl.Tag te zetten, en deze is gekoppeld aan de ToolStripButton. (zoals riezebosch dus ook al schrijft.)
Maar ik blijf het een vreemde situatie vinden, dat de ControlCollection zichzelf gaat hersorteren doordat ik een property van één van z'n items aanpas. 8)7
Kan je niet beter een refference van de bijbehorende control in de tag van je ToolStripButton doen. Als er dan een event op de button optreed kan je iets dergelijks doen

C#:
1
2
3
4
5
6
7
private void ToolStripButton_Click(object sender, EventArgs e)
{
    Control c = ((ToolStripButton)sender).Tag as Control;

    if( c != null )
        c.Visible != c.Visible;
}

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
rwb schreef op dinsdag 29 januari 2008 @ 23:21:
[...]

Kan je niet beter een refference van de bijbehorende control in de tag van je ToolStripButton doen. Als er dan een event op de button optreed kan je iets dergelijks doen

C#:
1
2
3
4
5
6
7
private void ToolStripButton_Click(object sender, EventArgs e)
{
    Control c = ((ToolStripButton)sender).Tag as Control;

    if( c != null )
        c.Visible != c.Visible;
}
Haha, dat was inderdaad ook wat ik bedoelde en dacht dat de TS ook zo opgelost had :)

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


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
riezebosch schreef op woensdag 30 januari 2008 @ 08:59:
[...]

Haha, dat was inderdaad ook wat ik bedoelde en dacht dat de TS ook zo opgelost had :)
Ja maar zoals ik het nu lees heeft hij een index erin gestopt, al met al is dat een beetje omslachtig :)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1