Toon posts:

[C#] Labelname samenstellen uit strings

Pagina: 1
Acties:

Verwijderd

Topicstarter
De vraag is, kan dat?
En zo niet hoe zou ik met volgende probleem kunnen aanpakken.

Ik heb een config file waarvan ik de waarde in een form wil laden om later te kunnen aanpassen en weer weg te schrijven. Lijkt simple he.

Hiervoor maak ik een Collection waarvan de Key overeen komt met de key uit de config file en een value met de value (De value is eigenlijk een object met meerder methods maar dat maakt volgens mij voor mijn vraag niet uit). Simple tot nu toe ....

Nu heb ik in mijn Form die Label - Textbox combinaties waarvan de Labelname is opgebouwd uit lbl_keyname en de textbox txt_keyname waarvan keyname weer overeen komt met de keyname van de collection. Ik dacht dus dat ik op deze manier heel makelijk de labels en textboxen kon vullen met de volgende code.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        private void PopulateFields(SortedList myList)
        {
            foreach (DictionaryEntry myDE in myList)
            {
                ConfigLine myConfigLine = (ConfigLine) myDE.Value;
                foreach (string FieldsToTest in ConfigFields)
                {
                    if (FieldsToTest == myConfigLine.Key)
                    {
                        string LabelName = ("lbl_" + FieldsToTest.ToString());
                        LabelName.Text = myConfigLine.Value;
                    }
                }
    
            }
        }

myList is een SortedList met key values waarvan de values objecten zijn met 3 properties.
ConfigLine is het object in de SortedList
FieldToTest is een array met Keys die ik uiteindelijke wil weergeven en op deze manier pick ik alleen die eruit.

Okee, dit werkt dus niet, maar iemand een sugestie hoe ik toch op deze, of een beter manier de textboxen kan vullen met mijn waarden??

Alvast bedankt.

PS: Voordat men zegt, waarom maak je je configfile niet in XML ofzo, dit is een bestaande configfile die al bij een programma zit. :9

[ Voor 5% gewijzigd door Verwijderd op 11-06-2004 08:41 . Reden: de PS ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Euh, je wilt de text property een Label veranderen, en daarvoor ga je een met een string werken ?
Denk je misschien dat die string je Label control zal bevatten nadat je de naam v/e label aan die string hebt toegewezen?
IMO compileert je stukje code zelfs al niet. Een string heeft geen property Text.

Je zult de Control Collection van je form moeten overlopen, en zo de juiste control moeten zien te vinden.

Zoiets dus:

code:
1
2
3
4
5
6
7
8
9
10
11
foreach( Control c in this.Controls )
{
    if( c.GetType() == typeof(Label) )
    {
         Label l = c as Label;
         if( l.Name ==  "lbl" + blaat )
         {
              l.Text = ... ;
         }
    }
}

[ Voor 26% gewijzigd door whoami op 11-06-2004 08:59 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Dat dacht ik in eerste instantie dus ook dus heb ik dat geprobeerd. Ik neem aan dat je dit bedoeld.
code:
1
foreach (Control test in ControlCollection)

Maar als ik dat dus doe, dan vindt hij de textboxen niet .... :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
ControlCollection is een class, niet een instance.
Je zult dus de instance van een ControlCollection nodig hebben; zie m'n voorbeeldje.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik heb bovenstaande code geprobeerd, maar hij pakt geen textboxen of labels, alleen comboboxen en tabControls die ik in mijn Form heb. 8)7
Vallen textbox en label wel onder de control instance

[ Voor 17% gewijzigd door Verwijderd op 11-06-2004 20:09 ]


  • De Cowboy
  • Registratie: Augustus 2003
  • Laatst online: 11-03-2022
Tabs hebben hun eigen control collection, dacht ik.

  • Yannick
  • Registratie: December 2000
  • Laatst online: 26-03-2024

Yannick

Bub MC

Controls kunnen meerdere niveau's diep genest zijn met de foreach pakt hij alleen 1 niveau diep en het kan zijn dat je labels een niveau dieper zitten doordat ze binnen een Panel of form staan. Je moet dus kijken of een control childcontrols heeft en daar dan weer door iteraten.

Hier is een voorbeeldje van 4guysfromrolla:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    void IterateThroughChildren(Control parent)
    {
      foreach (Control c in parent.Controls)
      {
        lblControlList.Text += "<li>" + c.ToString() + "</li>";
        if (c.Controls.Count > 0)
        {
          lblControlList.Text += "<ul>";
          IterateThroughChildren(c);
          lblControlList.Text += "</ul>";
        }
      }
    }

    void Page_Load(Object sender, EventArgs e)
    {      
      lblControlList.Text += "<ul>";
      IterateThroughChildren(this);
      lblControlList.Text += "</ul>";
    }


Dit is misschien een iets efficienter of nettere oplossing:
code:
1
foreach( Control c in this.FindControl("parentControlNaam").Controls )

Als je niet zeker weet wat de parent control is zet dan even trace aan om de control tree te bekijken (incl. de hyrarchie)

[ Voor 20% gewijzigd door Yannick op 12-06-2004 06:20 ]

Pagina: 1