[VB2008] dynamisch tekstvakken adresseren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ieperlingetje
  • Registratie: September 2007
  • Niet online
Ik maak dynamisch tekstvakken aan op mijn formulier, en dat werkt allemaal goed, maar nu wil ik die tekstvakken kunnen benaderen. Dus stel onderstaande (pseudo) code
code:
1
2
3
dim tekstvak as new textbox
me.controls.add(tekstvak)
tekstvak.name = "txtIetsDynamisch"


dan kun je niet zomaar iets als
code:
1
txtIetsDynamisch.text = "blabla"
gaan doen

Ik heb het halve internet afgezocht naar oplossingen, maar ofwel is het een verouderde methode dat men gebruikt, ofwel moet je volgens ID benaderen, maar ik heb geen idee hoe ik die kan gaan bepalen.

Iemand die me een zetje in de juiste richting kan geven?

Tijdmachine | Nieuws trends


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je gebruikt op regel 3 toch al textvak? :? Als je die variabele globaal opslaat (trefwoord: scope), dan kun je dat gewoon overal gebruiken. Je kan ook een array of iets anders gebruiken om de boel in op te slaan. Daarnaast kun je ook alle Controls afgaan, en/of bij events kijken naar sender. In welke situatie wil je je nieuwe control benaderen?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • ieperlingetje
  • Registratie: September 2007
  • Niet online
Ik wil een zoekformulier maken, waarbij je dus steeds extra criteria kan opgeven, daarom bouw ik de tekstvakken dynamisch

Tijdmachine | Nieuws trends


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 25-05 11:39
Het is niet de beste oplossing, maar je kunt altijd een control benaderen door de Controls collectie te gebruiken. Je kunt dan de naam van de control opgeven, en dan zal je de control terug krijgen (als die bestaat) als type Control. Dit Control object kun je dan casten naar het type dat je nodig hebt (TextBox in jouw geval). Je moet dus wel de Name property zetten zoals je nu ook al doet!

Visual Basic:
1
2
3
Dim control As Control = Me.Controls("txtIetsDynamisch")
Dim txt As TextBox = DirectCast(control, TextBox)
txt.Text = "hallo"


Let erop dat "Me.Controls" alleen de controls bevat die rechtstreeks op de form (Me) zitten. Een control die op een Panel, TabPage, GroupBox, etc, staat, zal daar dus niet inzitten. Als je textbox bijvoorbeeld in een GroupBox genaamd "GroupBox1" staat, dan zul je
Visual Basic:
1
Dim control As Control = GroupBox1.Controls("txtIetsDynamisch")

moeten gebruiken.

Ik raad je wel aan om wat error checking te gebruiken, bijvoorbeeld een check of 'control' niet Nothing is, en/of een TryCast ipv een DirectCast.

Maar zoals ik al zei, dit is vaak niet de beste oplossing. Zonder iets meer te weten van wat je precies wilt doen kan ik echter weinig advies geven.

[ Voor 6% gewijzigd door NickThissen op 25-05-2010 20:00 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

ieperlingetje schreef op dinsdag 25 mei 2010 @ 19:25:
Ik maak dynamisch tekstvakken aan op mijn formulier, en dat werkt allemaal goed, maar nu wil ik die tekstvakken kunnen benaderen. Dus stel onderstaande (pseudo) code
code:
1
2
3
dim tekstvak as new textbox
me.controls.add(tekstvak)
tekstvak.name = "txtIetsDynamisch"
Je textbox HEEFT al een naam, namelijk "tekstvak". Jouw probleem is dat jouw scope waarschijnlijk niet groot genoeg is. Declareer de tekstvak variabele eens buiten je functie en wijs hem pas toe wanneer je hem nodig hebt. Als je er meerdere nodig hebt werp je ze desnoods in een array.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Boeboe schreef op dinsdag 25 mei 2010 @ 20:06:
[...]


Je textbox HEEFT al een naam, namelijk "tekstvak".
Technically: Nee; je hebt een variabele met de naam "tekstvak" welke verwijst naar een textbox. De textbox's naam is "txtDynamischIets". En die kun je inderdaad middels de .Controls collectie benaderen op die naam. En je kunt wel heel leuk een eigen array/list/whatever met die controls bij gaan houden maar de .Controls collectie is er toch al...

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


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 25-05 11:39
Vaak is het toch beter om een eigen lijstje bij te houden, de Controls collectie heeft zo z'n problemen wat het niet vergemakkelijkt. Zo is hij bijvoorbeeld niet type-safe en bevat hij alleen de top-level controls. In een eigen lijstje kun je best een TextBox hebben die op een panel staat en een andere TextBox die op een groupbox staat, of iets dergelijks. Je kunt dan niet meer via de naam aan de control komen, maar dat zou vaak ook niet nodig hoeven zijn. Namen van controls kunnen nogal eens veranderen, en je wilt niet later de code gaan veranderen waar je die naam nog gebruikt. Je kunt dan beter een logische index gebruiken, of een Dictionary met keys. Die keys kunnen dan gewoon weer de naam zijn, maar je kunt ook een of andere cryptische code gebruiken, whatever je wil...

[ Voor 37% gewijzigd door NickThissen op 25-05-2010 20:44 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
ieperlingetje schreef op dinsdag 25 mei 2010 @ 19:55:
Ik wil een zoekformulier maken, waarbij je dus steeds extra criteria kan opgeven, daarom bouw ik de tekstvakken dynamisch
Ik zou zeggen gooi de boel in een List<TextBox> die de scope van de form heeft. Dat de controls-collectie er ook al is boeit verder niet: dat wordt alleen maar extra ingewikkeld en geheugen is hier geen issue.

Maar even heel anders: Google heeft geen meerdere textboxen ofzo voor dit soort dingen, en werkt prima. Bedenk dus even of dit wel een goed ontwerp is, of dat de user interface handiger kan.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NickThissen schreef op dinsdag 25 mei 2010 @ 20:43:
Zo is hij bijvoorbeeld niet type-safe
Since when?
Dat er controls in zitten en dus niet alléén maar buttons (in dit geval) maakt het nog niet niet-type-safe hoor ;)

Afbeeldingslocatie: http://tweakers.net/ext/f/2g3DBrVhpbBUljJCzXCEW2ch/full.png
NickThissen schreef op dinsdag 25 mei 2010 @ 20:43:
en bevat hij alleen de top-level controls
En met een recursieve functie rag je so door (eventuele) childcontrols heen als 't moet. NB: Ik zeg niet dat je per-se de controls collection moet gebruiken; het kan heel handig zijn je eigen list/array/collectie/whatever van controls bij te houden, maar maak die keuze dan wel bewust.
NickThissen schreef op dinsdag 25 mei 2010 @ 20:43:
In een eigen lijstje kun je best een TextBox hebben die op een panel staat en een andere TextBox die op een groupbox staat, of iets dergelijks.
Als de GUI van TS een beetje logisch in elkaar zit hebben de controls zeer waarschijnlijk ook allemaal dezelfde parent; be it het form zelf of een panel/groupbox/whatever.
NickThissen schreef op dinsdag 25 mei 2010 @ 20:43:
Namen van controls kunnen nogal eens veranderen
Dat doen ze echt niet vanzelf hoor; en al helemaal niet als je ze in code genereert. Beetje een non-argument.

Nogmaals: het kan heel handig zijn je eigen list/array/collectie/whatever van controls bij te houden, maar maak die keuze dan wel bewust en weet waarom je die kiest.

[ Voor 17% gewijzigd door RobIII op 25-05-2010 21:08 ]

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


Acties:
  • 0 Henk 'm!

  • ieperlingetje
  • Registratie: September 2007
  • Niet online
Het is een late reactie, maar ik heb op dit moment niet zo vaak toegang tot internet.
Dank je voor de tip van Me.Controls. Stom dat ik niet had opgemerkt dat je ook de naam als argument kan opgeven in plaats van enkel ID. Mocht je een idee willen hebben hoe de interface wordt opgebouwd, idee heb ik van iTunes gepikt :P Afbeeldingslocatie: http://artoftheiphone.com/wp-content/uploads/2008/03/rate-songs-smart-playlist.jpg

Tijdmachine | Nieuws trends

Pagina: 1