Toon posts:

[VB.NET] 20 Textboxes in 1 maal aanpassen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik, en nog zo een 8 andere mensen hebben op het moment een probleem met VB.net.

Er staan hier 20 textboxes. Deze moeten allemaal een bepaalde waarde, of een random waarde krijgen. Op het moment word dat alsvolgt gerealiseerd:

code:
1
2
3
4
5
6
7
Som1a.Text = "Waarde"
Som2a.Text = "Waarde"
Som3a.Text = "Waarde"
Som4a.Text = "Waarde"
Som5a.Text = "Waarde"
Som6a.Text = "Waarde"
...


Nu is het veel makkelijker als dat in een loop word gezet, maar helaas is het niet zo simpel als volgt:
code:
1
2
3
4
5
6
7
Dim K As Double
Do While K < 2000

Som *K* a.Text = "Waarde"

K += 1
Loop


Hoe kan ik een dergelijk probleem oplossen? Hoe kan ik de "K" verwerken in de variables?

  • whoami
  • Registratie: December 2000
  • Laatst online: 05:46
Kijk eens naar de ControlCollection van je form:

code:
1
2
3
4
5
6
7
8
9
10
11
12
foreach( Control c in this.Controls )
{

    TextBox t = c as TextBox;

    if( t != null )
    {
       // bla.
    }


}


* whoami vind het vreemd dat sommige mensen denken dat ze een variable-naam 'dynamisch' kunnen opbouwen...

[ Voor 5% gewijzigd door whoami op 07-03-2005 12:56 ]

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Mja, ze zelf even in een array/arraylist plaatsen en ze aflopen is wellicht wat teveel werk? ;) Je kunt ook een grid gebruiken, maar dit soort 'vb6' constructies kunnen gelukkig niet meer (controls in control arrays plaatsen waardoor je door de bomen het bos niet meer zag welk control werd gewijzigd op een willekeurige regel code.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Lukse
  • Registratie: Januari 2004
  • Laatst online: 12-04-2023
Je kan dit doen met een for each loop.
Iets in die aard:
code:
1
2
3
for each t as textbox in me.controls
  if t.name.substring(3) = "Som" then t.text = "bla"
next

  • whoami
  • Registratie: December 2000
  • Laatst online: 05:46
Lukse schreef op maandag 07 maart 2005 @ 12:57:
Je kan dit doen met een for each loop.
Iets in die aard:
code:
1
2
3
for each t as textbox in me.controls
  if t.name.substring(3) = "Som" then t.text = "bla"
next
Dit is wel niet echt veilig...
Wat als t nu eens geen textbox is ? Dan krijg je een null-violation.

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 10-05 15:56
Je zou een string kunnen maken en aan de hand daarvan je control zoeken, zoiets:
C#:
1
2
3
4
5
6
7
string s = "";
for( i=0; i <= 20; i++ )
{
  s = "Som" + i.ToString() + "a";
  TextBox tb = Form.FindControl( s );
  tb.Text = "waarde";
}

[ Voor 12% gewijzigd door sig69 op 07-03-2005 13:00 ]

Roomba E5 te koop


  • Database freak
  • Registratie: Oktober 1999
  • Laatst online: 21-01 12:56
In VBA kon je geven:

for l=1 to 20
me.Controls("Som" & L & "a").Text = "blabla")
next l

  • whoami
  • Registratie: December 2000
  • Laatst online: 05:46
Database freak schreef op maandag 07 maart 2005 @ 13:01:
In VBA kon je geven:

for l=1 to 20
me.Controls("Som" & L & "a").Text = "blabla")
next l
Maar .NET is geen VBA....
sig69 schreef op maandag 07 maart 2005 @ 13:00:
Je zou een string kunnen maken en aan de hand daarvan je control zoeken, zoiets:
C#:
1
2
3
4
5
6
7
string s = "";
for( i=0; i <= 20; i++ )
{
  s = "Som" + i.ToString() + "a";
  TextBox tb = Form.FindControl( s );
  tb.Text = "waarde";
}
FindControl werkt enkel maar in webforms....
Nuja, we weten natuurlijk niet of de TS in winforms of webforms bezig is....

[ Voor 54% gewijzigd door whoami op 07-03-2005 13:16 ]

https://fgheysels.github.io/


  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 21:52
Vb.net
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
     'Naam() initialiseren
        For i = 100 To UBound(naam)
            naam(i) = "hoi"
        Next

        For i = 100 To UBound(naam) - 1
            'Look for each label's tab index.
            For Each ControlObj In Controls
                If ControlObj.TabIndex = i Then
                    ControlObj.Text = naam(i) 'Tab index matches, set its text.
                End If
            Next ControlObj
        Next i


Alles declareren:
code:
1
2
3
  Dim i As Byte = 0
        Dim ControlObj As Control
        Dim naam(119) As String

Verwijderd

Topicstarter
Dat is opzich een mooie code, maar ik kan eruit begrijpen dat dit met TabIndex-en werkt, en imho niet echt fail-safe is. Kan het niet een beetje op de wijze zoals ik het in de OP beschrijf?

whaomi, wat bedoel je precies met webforms en winforms? Ik maak gewoon een simpele offline applicatie :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 05:46
Verwijderd schreef op maandag 07 maart 2005 @ 13:27:

whaomi, wat bedoel je precies met webforms en winforms? Ik maak gewoon een simpele offline applicatie :)
WinForms == Windows app
WebForms == asp.net app.

Als je gewoon door je control collection loopt, en checkt of je huidige control een textbox is, en of dit een textbox is die wilt aanpassen, (ongeveer zoals ik in m'n eerste reply getoond heb), dan kan je 't doen.

Hetgeen EfBe zegt is misschien zelfs nog ietwat beter: op die manier heb je gewoon een collectie van controls waarvan je weet dat je die wilt aanpassen.

https://fgheysels.github.io/


  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 21:52
Wat zou er niet fail-safe aan zijn, je vult zelf de tab-index in en je kan het zo helemaal instellen :)

Verwijderd

Topicstarter
Omdat ik deze code zo ongeveer 8 keer ga gebruiken in mijn programma, en het imho nog steeds netter is zonder tab-index te werken en dus simpelweg met de name attributes :)

Daarnaast is deze code bijna extreem lang voor wat "simpel" werk :)

  • Lukse
  • Registratie: Januari 2004
  • Laatst online: 12-04-2023
whoami schreef op maandag 07 maart 2005 @ 13:00:
[...]


Dit is wel niet echt veilig...
Wat als t nu eens geen textbox is ? Dan krijg je een null-violation.
Ja, idd.
't as Textbox' vervangen door 'o as Object'
En dan elke keer checken of o een Textbox is.

  • whoami
  • Registratie: December 2000
  • Laatst online: 05:46
Nee, gewoon die as laten staan, en checken of t geen NULL is.

Op de manier die jij het zegt, moet je dan telkens gaan kijken of het een checkbox is, zoja, casten , etc...

https://fgheysels.github.io/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik snap niet waarom er geen control-array wordt gemaakt?
Alle oplossingen hieboven zijn IMHO erg ranzig. Zie ook [rml]EfBe in "[ VB.NET] 20 Textboxes in 1 maal aanpasse..."[/rml]

[edit]
Huh :?
Zit net effe te kijken, kent VB.Net geen control-arrays meer? :? Wat is dat nou weer voor onzin?

Ik ga effe verder kijken...

http://visualbasic.about....net/l/bldykctrlarraya.htm
http://visualbasic.about....net/l/bldykctrlarray2.htm
http://visualbasic.about....net/l/bldykctrlarray3.htm
http://visualbasic.about....net/ss/dykctrlarray5a.htm

[ Voor 63% gewijzigd door RobIII op 07-03-2005 14:58 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • whoami
  • Registratie: December 2000
  • Laatst online: 05:46
RobIII schreef op maandag 07 maart 2005 @ 14:51:
Ik snap niet waarom er geen control-array wordt gemaakt?
Alle oplossingen hieboven zijn IMHO erg ranzig. Zie ook [rml]EfBe in "[ VB.NET] 20 Textboxes in 1 maal aanpasse..."[/rml]

[edit]
Huh :?
Zit net effe te kijken, kent VB.Net geen control-arrays meer? :? Wat is dat nou weer voor onzin?

Ik ga effe verder kijken...
In .NET heeft een form een ControlCollection (net zoals iedere andere 'container control'). Daar zitten dus zowiezo al al je controls in; die kan je gebruiken om over te loopen.

Verder kan je gewoon ook een arraylist / hashtable / oid gebruiken om je controls in te proppen; een control is een object, dus dat past er gewoon in.
(Desnoods kan je -denk ik- zelf ook wel een Form.ControlCollection gaan instanteieren.

https://fgheysels.github.io/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
whoami schreef op maandag 07 maart 2005 @ 14:57:
[...]


In .NET heeft een form een ControlCollection (net zoals iedere andere 'container control'). Daar zitten dus zowiezo al al je controls in; die kan je gebruiken om over te loopen.
Tja, ik zit al eeuwen in VB6 te devven, en stel dus klaarblijkelijk mijn stap naar VB.Net veel te lang uit. Dit is redelijk basic IMHO, en toch wist ik dus niet dat control-arrays geschrapt zijn waren. |:( Ik sta er dan ook érg van te kijken dat 't er niet in zit zat.

Er blijkt in de nieuwe versie van VB.Net wel weer ondersteuning voor control arrays te komen :?

Sorry dat ik jullie oplossingen "ranzig" vond :| Het kan dus blijkbaar niet zo heel veel netter...

Enniewee, bovengenoemde linkjes uit mijn ovrige post bieden schijnbaar soelaas en lijken toch wel weer "enige" ondersteuning voor control arrays terug te brengen (voor zover ik kan zien) ;)

[ Voor 28% gewijzigd door RobIII op 07-03-2005 15:03 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

RobIII schreef op maandag 07 maart 2005 @ 15:00:
[...]

Tja, ik zit al eeuwen in VB6 te devven, en stel dus klaarblijkelijk mijn stap naar VB.Net veel te lang uit. Dit is redelijk basic IMHO, en toch wist ik dus niet dat control-arrays geschrapt zijn waren. |:( Ik sta er dan ook érg van te kijken dat 't er niet in zit zat.

Er blijkt in de nieuwe versie van VB.Net wel weer ondersteuning voor control arrays te komen :?

Enniewee, bovengenoemde linkjes bieden schijnbaar soelaas ;)
Ze bestaan nog wel, maar staan niet standaard tussen de componenten. Je moet ze dus zelf toevoegen, maargoed.. wie wil dat nou?

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Check je toch gewoon of het een textbox is?:

C#:
1
2
if (typeof(TextBox).IsInstanceOfType(_c) == true)
    Textbox _t = (Textbox)_c;


(waarbij _c dus de foreach (Control _c in this.Controls) is )

[ Voor 25% gewijzigd door 6K op 07-03-2005 15:16 ]

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • EfBe
  • Registratie: Januari 2000
  • Niet online
6K schreef op maandag 07 maart 2005 @ 15:10:
Check je toch gewoon of het een textbox is?:

C#:
1
2
if (typeof(TextBox).IsInstanceOfType(_c) == true)
    Textbox _t = (Textbox)_c;


(waarbij _c dus de foreach (Control _c in this.Controls) is )
whoa! :D

Textbox t = _c as Textbox;
if(_c!=null)
{
_c.Text = "lallaa";
}

niet 'as' opnieuw implementeren als je al een keyword hebt dat dat doet ;) Maar deze oplossing had whoami al gegeven dacht ik.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1