• 0

VB.Net - Dynamically accessing controls then accessing them after


Question

Right, I have some code that dynamically creates controls that I need, and obviously you can give them a name and what have you.

The controls will be created on form load, yet how do I access the controls after I've added them?

VB.Net doesn't seem to know they are they due to me generating them at run time.

Any ideas?

[Just Read the Topic Title and realised i've typed a big steaming pile of ****. Lovely.]

10 answers to this question

Recommended Posts

  • 0

OK, you've created the control, say a TextBox, the page has loaded, the user enters their input, the form is submitted and you want to get the value that the person entered, but it always turns up with no value in it?

  • 0
  Jelly2003 said:
OK, you've created the control, say a TextBox, the page has loaded, the user enters their input, the form is submitted and you want to get the value that the person entered, but it always turns up with no value in it?

No. Created a textbox using Code and not the IDE at runtime, but its not accessible? after you've created it you can't access it by the name you've created for it.

  • 0

If you dynamically create a control the "name" property means nothing... The Name property is for the IDE only and has no meaning at runtime

say you make a control like this

public class MyForm

Dim MyControl as new TextBox

public sub new

Me.Controls.Add(MyControl) ' add to form

with MyControl

.size = new size(21,100)

.Location = new Point(10,10)

end With

end sub

public sub UpdateControlsText

' Access the control now with the object you made in the class outside of a sub or function

MyControl.Text = "Text Here"

End Sub

end class

not that hard eh? anytime you make a control inside a sub though you need a reference to the control so you can access it outside that sub also!

  • 0

Wel, no doubt that you are adding them to the control container of the form (<form>.Controls) ? If so, you need to iterate through that to find your control, you may have to do it recusively if it is a nested control.

The best way to do this, is to apply a unique value to either the name, or the tag property of the control at runtime (i.e during the control generation):

Public Function FindControl(parent As Control, ident As String) As Control
   Dim control As Control
   For Each child As Control In parent.Controls
	  If (child.Tag.Equals(ident, StringComparer.InvariantCultureIgnoreCase)) Then
		 control = child
		 Exit For
	  End If
   End For
   Return control
End Function

Start with passing the main form as the parent control.

  • 0

Assuming that you're using ASP.net and not Windows Forms then you could use the "FindControl" method (provided that it implements it).

Object.FindControl("ControlName")

or

Object.FindControl("ControlName", true)

To recursively search the controls.

I am a C# guy so you would need to do some research on the VB.net way of doing it, but it will be very much the same.

  • 0
  neufuse said:
If you dynamically create a control the "name" property means nothing... The Name property is for the IDE only and has no meaning at runtime

say you make a control like this

public class MyForm

Dim MyControl as new TextBox

public sub new

Me.Controls.Add(MyControl) ' add to form

with MyControl

.size = new size(21,100)

.Location = new Point(10,10)

end With

end sub

public sub UpdateControlsText

' Access the control now with the object you made in the class outside of a sub or function

MyControl.Text = "Text Here"

End Sub

end class

not that hard eh? anytime you make a control inside a sub though you need a reference to the control so you can access it outside that sub also!

  Jelly2003 said:
Assuming that you're using ASP.net and not Windows Forms then you could use the "FindControl" method (provided that it implements it).

Object.FindControl("ControlName")

or

Object.FindControl("ControlName", true)

To recursively search the controls.

I am a C# guy so you would need to do some research on the VB.net way of doing it, but it will be very much the same.

Its VB.NET but thanks for the PM anyway. And to the first reply, I thought of that but I have no idea how many controls i am going to have, therefore I'd need an array but not knowing how big it is, how would I allocate for that in .Net?

  • 0
  MiG- said:
Its VB.NET but thanks for the PM anyway. And to the first reply, I thought of that but I have no idea how many controls i am going to have, therefore I'd need an array but not knowing how big it is, how would I allocate for that in .Net?

why would you need an array? if you add it to a container control such as a form or panel that control / form has a controls property which you can use to reference controls that have been added to the form / container... that would be the only case you'd want to specify a "name" for a control then you could do a string.compare to compare the name of the control and the item you are looking for

  • 0
  neufuse said:
why would you need an array? if you add it to a container control such as a form or panel that control / form has a controls property which you can use to reference controls that have been added to the form / container... that would be the only case you'd want to specify a "name" for a control then you could do a string.compare to compare the name of the control and the item you are looking for

going on the code you demo'd, which is pretty much how i'm going about things...

I'm currently doing...

Adding tab pages to a Tab Control based on the number specified. Then for each tab I need to have the same grid drawn on them, which would be a series of textboxes.

Seen as I need a variable name for each control that is added, preferably an array seen as its a grid ;) how would I determine how many variables I need?

Probably going about this all wrong but whatever! :D

  • 0
  neufuse said:
If you dynamically create a control the "name" property means nothing... The Name property is for the IDE only and has no meaning at runtime

I'm not sure that I agree with you here.

The "Name" property is plenty valid at runtime, and I think that it's good programming practice to set it when you create a control

eg

Dim newctl As New System.Windows.Forms.TextBox

newctl.Location = New System.Drawing.Point(102, 9)

newctl.Name = "txtMyNewControl"

newctl.Size = New System.Drawing.Size(95, 20)

newctl.TabIndex = 9

Me.Controls.Add(newctl)

  neufuse said:
say you make a control like this

public class MyForm

Dim MyControl as new TextBox

public sub new

Me.Controls.Add(MyControl) ' add to form

with MyControl

.size = new size(21,100)

.Location = new Point(10,10)

end With

end sub

public sub UpdateControlsText

' Access the control now with the object you made in the class outside of a sub or function

MyControl.Text = "Text Here"

End Sub

end class

not that hard eh? anytime you make a control inside a sub though you need a reference to the control so you can access it outside that sub also!

True - but if you've named the control you can find it ;-)

The following function will "find" a control by name on a form, even if it's hiding inside a tab control...

Private Function FindControl(ByVal parent As Control, ByVal ident As String) As Control

Dim n As Integer

Dim tmpctrl As Control

Dim tmpctrl2 As Control

For n = 0 To parent.Controls.Count - 1

tmpctrl = parent.Controls(n)

If tmpctrl.Name = ident Then

Return parent.Controls(n)

ElseIf tmpctrl.Controls.Count > 0 Then

tmpctrl2 = FindControl(tmpctrl, ident)

If Not IsNothing(tmpctrl2) Then

Return tmpctrl2

End If

End If

Next

' Not found

Return Nothing

end function

You call it by sending "me" (ie the form) and the name of the control you want to manipulate.

  • 0
  MiG- said:
going on the code you demo'd, which is pretty much how i'm going about things...

I'm currently doing...

Adding tab pages to a Tab Control based on the number specified. Then for each tab I need to have the same grid drawn on them, which would be a series of textboxes.

Seen as I need a variable name for each control that is added, preferably an array seen as its a grid ;) how would I determine how many variables I need?

Probably going about this all wrong but whatever! :D

Well first of all, it sounds like what you really want is a custom UserControl that includes the appropriate TextBox grid. Then when you need to add a page, you add one of those to it, instead of manually adding all the text boxes each time. You can even build your custom control in the Forms Designer. And you can put simple methods / properties on it to handle any work it needs to do for you, or expose any data you need in the parent form.

If the parent form (code outside the UserControl) needs to access the text boxes, or they need to access each other, there are several ways to accomplish that. For example, you can maintain an array / list with references to all the custom controls you added. Or you can simply get to the custom control through the Tab control.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I think the flub is slightly funny, albeit minor. What will be funnier is the people buying some utterly terrible Chinese Android phone for $500 (that's with a huge profit margin worked in). That said, I've bemoaned this before: I miss the days when Neowin was about Microsoft products and technologies and didn't host articles that would get people riled up politically. It used to be a friendlier place where people were only bitches about insignificant things related to Microsoft.
    • AMD thinks Ryzen Threadripper 9000 wipes the floor with Intel by Sayan Sen At Computex 2025 earlier this year, AMD revealed its new Zen 5-based Ryzen Threadripper 9000 series with up to 96 cores, comprising the PRO 9000WX series and 9000 series chips. At the time though the company did not share performance numbers but given the specs, we had a fairly good idea of their capability. For those who may not be familiar with Ryzen Threadripper, it is AMD's desktop CPU lineup meant for workstations and HEDT (high-end desktop) builds and is placed between the mainstream Ryzen and the server EPYC lineups. With the launch expected to happen next month, performance numbers for the Ryzen Threadripper 9000 are now out. Before diving into the performance details, AMD has also shared a recap of some of the platform details and the compatible sTR5 socket. These new premium chips support up to 8 channels of DDR5-6400 memory and up to 128 PCIe 5.0 lanes for I/O. AMD also promises over 7000 MT/s of DDR5 support with EXPO. The specs of the Ryzen Threadripper 9000 lineup are given below: Processor SKU Cores Threads Base Clock (GHz) Boost Clock (GHz) L3 Cache (MB) Memory Channels PCIe Lanes TDP (W) AMD Ryzen Threadripper PRO 9995WX 96 192 2.5 5.45 384 8‑channel DDR5‑6400 ECC 128 PCIe Gen5 350 AMD Ryzen Threadripper PRO 9985WX 64 128 3.2 5.4 384 8‑channel DDR5‑6400 ECC 128 PCIe Gen5 350 AMD Ryzen Threadripper PRO 9975WX 32 64 3.2 5.4 384 8‑channel DDR5‑6400 ECC 128 PCIe Gen5 350 AMD Ryzen Threadripper PRO 9965WX 24 48 3.2 5.4 384 8‑channel DDR5‑6400 ECC 128 PCIe Gen5 350 AMD Ryzen Threadripper PRO 9955WX 16 32 3.2 5.4 384 8‑channel DDR5‑6400 ECC 128 PCIe Gen5 350 AMD Ryzen Threadripper PRO 9945WX 12 24 3.2 5.4 384 8‑channel DDR5‑6400 ECC 128 PCIe Gen5 350 AMD Ryzen Threadripper 9980X 64 128 3.2 5.4 256 4‑channel DDR5‑6400 92 PCIe Gen5 350 AMD Ryzen Threadripper 9970X 32 64 3.2 5.4 256 4‑channel DDR5‑6400 92 PCIe Gen5 350 AMD Ryzen Threadripper 9960X 24 48 3.2 5.4 256 4‑channel DDR5‑6400 92 PCIe Gen5 350 AMD has compared the 96-core 9995WX against the previous-gen 7995WX (images below), also with the same core configuration, and the 64-core 9980X, against Intel's 60-core Xeon W9-3595X. While Xeon has generally been associated with Server CPUs, the Xeon W chips are designed to be used in workstations. AMD follows a similar naming, too, wherein the W in the WX is meant to indicate workstation, and the non-W Threadripper is for HEDT. AMD claims up to 26% faster throughput on the newer 96-core 9995WX compared to the 7995WX. Meanwhile, against the Intel Xeon w9-3595X, AMD expects utter dominance from its 9980X with up to 108% faster performance. Even the lowest gain, says the company, is 22% over the Intel chip, and that is still very significant. AMD also compared the AI performance of the 9995WX vs the Xeon w9-3595X. The company promises up to 49% faster LLM processing, but keep in mind that the figures given include a GPU as well. Besides AI, performance related to other creative and professional workloads was also shared. In Keyshot rendering, for example, AMD claims up to 119% gains over the Xeon SKU. And in Chaos V-Ray, the 9995WX is said to offer nearly 2.5 times the performance. AMD has not released pricing information for the Threadripper 9000 series.
    • Funk Microsoft - I would switch from PS5 as you have better deals but the Xbox interface (I tried One S and later on, even one X i hate the interface and considering all MS changes in Windows interface over the years.. I hope they have a good one coming ps5 has also weird interface I had to get used too. But considering the library of ps4 games I wanted to be playable for me… I got used and adapted
  • Recent Achievements

    • First Post
      Ian_ earned a badge
      First Post
    • Explorer
      JaviAl went up a rank
      Explorer
    • Reacting Well
      Cole Multipass earned a badge
      Reacting Well
    • Reacting Well
      JLP earned a badge
      Reacting Well
    • Week One Done
      Rhydderch earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      654
    2. 2
      ATLien_0
      267
    3. 3
      Michael Scrip
      218
    4. 4
      +FloatingFatMan
      188
    5. 5
      Steven P.
      146
  • Tell a friend

    Love Neowin? Tell a friend!