Toon posts:

[C#] Repeating usercontrol

Pagina: 1
Acties:

Verwijderd

Topicstarter
Tweakers,

De situatie

Ik wordt echt helemaal gek. Ik heb een C# usercontrol gemaakt met een label en een textbox. Dit control noem ik FF "ctrInvoer". Deze vul ik met globale properties. Er is helemaal niks static gedefinieerd.

Nu heb ik een tweede usercontrol met een panel erop. De bedoeling is dat deze in een loop een x aantal "ctrlInvoer" componenten onder elkaar op het panel plaats. Ongeveer zo:

code:
1
2
3
4
5
6
7
8
9
  foreach( dataItem myData in dataLijst)
  {
     ctrlInvoer currentInvoer = new ctrlInvoer();
     currentInvoer.Label = dataItem.Label;
     currentInvoer.Text = dataItem.Text;
     currentInvoer.Visible = true;
     currentInvoer.Location = [i]Nieuwe y coordinaat op het panel[/i]
     pnlMetCtrlInvoerControls.Controls.Add(currentInvoer);
  }


Wat gaat er fout

Het usercontrol met de panel toont keurig netjes alle usercontrols met label en textbox onder elkaar, precies zoals de bedoeling was. Het probleem is alleen dat het label op het tweede control ook het label van het eerste control onder zich lijkt te hebben, het label van het derde control (de derde rij) heeft de labels van het eerste en tweede control onder zich staan, etc.

Ik snap er dus helemaal geen hout meer van. Ik maak toch echt nieuwe instanties aan van dat usercontrol, wat doen die oude labels van vorig aangemaakte controls er dan nog bij?

Wat heb ik geprobeerd?

Een refresh geven op het panel werkt niet, ook niet het zelf instellen van unieke "name" properties op alle controls. Zoeken op google naar "repeating C# usercontrols" etc geeft allemaal geen hit waar ik naar op zoek ben. Nu hoop ik hier hulpt te vinden :)

  • phYzar
  • Registratie: November 2001
  • Laatst online: 10:00
Misschien dat ze toch conflicteren vanwege dezelfde objectnamen. Misschien zoiets:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ctrlInvoer[] currentInvoer = new ctrlInvoer[dataLijst.count];
int invoerCounter = 0;

  foreach( dataItem myData in dataLijst)
  {
     ctrlInvoer currentInvoer[invoerCounter] = new ctrlInvoer();
     currentInvoer[invoerCounter].Label = dataItem.Label;
     currentInvoer[invoerCounter].Text = dataItem.Text;
     currentInvoer[invoerCounter].Visible = true;
     currentInvoer[invoerCounter].Location = [i]Nieuwe y coordinaat op het panel[/i]
     pnlMetCtrlInvoerControls.Controls.Add(currentInvoer[invoerCounter]);

     invoerCounter++;
  }


(ongetest en syntax uit de duim)

Verwijderd

Topicstarter
Net getest... als ik van te voren een arraylist aanmaak met het aantal usercontrols als nieuwe items toegevoegd, en ik ga doodleuk die gebruiken, dan weet ie het alsnog te verkloten. Ik snap er echt helemaal niks meer van. Er zal wel weer een soort magische "IDontFuckThisUp" interface zijn waar ik van moet inheritten, maar die kan ik niet vinden.

[ Voor 23% gewijzigd door Verwijderd op 25-12-2004 15:14 ]


Verwijderd

Heb je wel gecontroleerd of alle dataItem in dataLijst wel kloppen? Wat ik hiermee bedoel is dat het tijdens het aanmaken / vullen van deze lijst al fout zou kunnen gaan ...

[ Voor 6% gewijzigd door Verwijderd op 25-12-2004 15:27 ]


  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
probeer ze eens allemaal een (verschillend) ID mee te geven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  int counter = 0;
  foreach( dataItem myData in dataLijst)
  {
     ctrlInvoer currentInvoer = new ctrlInvoer();
     currentInvoer.Label = dataItem.Label;
     currentInvoer.Text = dataItem.Text;

     currentInvoer.ID = "invoer" + counter;
     counter++;

     currentInvoer.Visible = true;
     currentInvoer.Location = [i]Nieuwe y coordinaat op het panel[/i]
     pnlMetCtrlInvoerControls.Controls.Add(currentInvoer);
  }


Handiger is wellicht in de aspx een Repeater te stoppen en deze te databinden met de dataLijst.

  • RSchellhorn
  • Registratie: Augustus 2001
  • Laatst online: 15-05 13:17
Verwijderd schreef op zaterdag 25 december 2004 @ 13:13:
C#:
1
2
3
4
5
6
  foreach( dataItem myData in dataLijst)
  {
     // ...
     currentInvoer.Label = dataItem.Label;
     // ...
  }
Misschien niet een oplossing voor je probleem, maar volgens mij (en de msdn) schrijf je een foreach-lus echt als volgt (msdn docs):
C#:
1
foreach (type identifier in expression) statement 

Wat dus betekend dat je niet dataItem.Label moet schrijven maar myData.Label.

(Goede conventie is het om klassen met een hoofdletter te schrijven trouwens)

[ Voor 3% gewijzigd door RSchellhorn op 25-12-2004 21:00 . Reden: typos ]

"Ik heb zo veel soep gegeten, dat kan een mens niet aan. Ik heb zo veel soep gegeten, kan bijna niet meer staan. Ik zat daar maar te slurpen achter die grote kop en als ik bijna klaar was, dan schepten ze weer op!" (Hans Teeuwen)


Verwijderd

Topicstarter
Klopt, de code was maar een voorbeeld, als het er zo had gestaan zou ie inderdaad niet gecompiled hebben. Ik heb al geprobeerd alles met verschillende ID's te namen. Het gaat hier overigens om een windows forms control. Het lijkt alsof op elke volgende rij de vorige rij ook wordt weergegeven. Ik heb nu alle transparantie uitgezet zodat de vorige controls niet meer door het laatste control heen drukken. Het ding is nu functioneel, maar een mooie oplossing is het natuurlijk niet.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
edit:

ow je had het over windows forms. Dan heb ik niks gezegd :)

[ Voor 88% gewijzigd door Woy op 29-12-2004 16:55 ]

“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