im having syntax issues pulling data from 6 text boxes with identical names (other than a number at the end) in a for loop - vb.net

I have 6 different text boxes with similar names:
txtBox1, txtBox2....txtBox6
I also have an array:
dim intValue (0 to 5) as Integer
Now I want to use a for loop to assign the value in each text box to a corresponding space in the array, concatenating the value of the loop counter with the string "txtBox" and retrieving the data using the .text method.
here is my code:
For count As Integer = 0 To 5
Dim strCount As String = count
Dim strTxtBox As String = "txtBox" & strCount
intValues(count) = Convert.toInt32(strTxtBox.Text)
Next
the issue is that the string name doesn't point to txtBox1, txtBox 2 etc.
Thanks in advance for the help.

If you want to access the control name, you have to use the property "Name".
You should try something like that:
For i As Integer = 0 To 5
For Each c As Control In Controls
If c.Name = "txtBox" & i Then
intValue(i) = Convert.ToInt32(c.Text)
End If
Next
Next i
The above code is just an example, but it should work for you.
Anyway you can write a better code checking the type of the control or maybe using a different loop logic, but the basic idea is that if you want to use in your code the name od the control you have to use the NAME property.

strTxtBox is a string, nothing more. You cannot refer to control names by String without special code. Rather than go down that path, I'd create an array and populate it with text boxes:
Dim txtBoxes As TextBox() = {txtBox1, txtBox2, txtBox3, txtBox4, txtBox5, txtBox6}
Dim intValues As Integer(0 To 5)
For count As Integer = 0 To 5
intValues(count) = Convert.ToInt32(txtBoxes(count).Text)
Next

The easiest way is to iterate through the contents of Controls to find the textboxes. You can either:
Use the .Tag property to label textboxes to identify them, or as the other answer points out, use the .Name property.
If you have a lot of other controls on the form, and they may not be in order, you could also check each control to see if it's a textbox. Assume they are in reverse order, as the Controls array goes from end to beginning.
Dim nums() As Integer = {10, 20, 30, 40, 50, 60}
Dim ctrl As Control
For Each ctrl In Me.Controls
If TypeOf (ctrl) Is TextBox Then
ctrl.Text = nums(Val(ctrl.Name(ctrl.Name.Length - 1)) - 1)
End If
Next
You could also instantiate an array of textboxes programmatically, but you'd have to set all of the placement, etc. by hand.
As I commented on the answer below, you may need to cast the ctrl to a System.Web.UI.Control to access the .Name, using DirectCast.

Related

Sorting List of Control by name

I'm trying to sort list of Controls by their name. This is my code to loop through Form Controls and add them to list.
Public Sub FindControls(ByVal owner As Control, ByVal list As List(Of Control), ByVal name As String)
'list.Clear()
For Each c As Control In owner.Controls
If c.Name.Contains(name) And c.Name.Length < 4 Then
list.Add(c)
End If
If c.HasChildren Then FindControls(c, list, name)
Next
End Sub
Then i want to loop through this list and get value from these controls by index.
For i As Integer = 0 To ElektrikList.Count - 1
If ElektrikList(i).Name = "T" & i.ToString Then
'do something
End If
Next
I named all my controls "T00" (example: "T1" or "T50"), but they are added to the list with wrong order, so for example index 4 in this List is T23, not T4 as I would wish.
Is there any way to sort it? I tried everything i found but I can't get it to work.
At first i tried to create all these controls dynamically, but I want to add them on different Panels with categories and so on, so i thought it would be really painful to make this.
Would something like this work?
Dim sorted = From ctrl In owner.Controls
Order By ctrl.Name
For Each c As Control In sorted
(...)
I followed the example from Introduction to LINQ in Visual Basic.
I named all my controls "T00" (example: "T1" or "T50"), but they are
added to the list with wrong order
If you're only interested in those specific controls, then search for them in that order using the recurse option of Controls.Find() and add them to your list:
Public Function FindControls() As List(Of Control)
Dim ctrls As New List(Of Control)
For i As Integer = 1 To 50
Dim ctrlName As String = "T" & i.ToString("00")
Dim ctrl As Control = Me.Controls.Find(ctrlName, True).FirstOrDefault
If Not IsNothing(ctrl) Then
ctrls.Add(ctrl)
End If
Next
Return ctrls
End Function

Iterate through variables using a variable?

I'm trying to find a way to iterate through a list of Strings to be displayed in a text box. These Strings are retrieved from a separate class called 'texts'.
The Strings are declared in the 'texts' class as (for ngs1, 2, 3, etc)
Public Shared ngs1 As String = "Text"
This chunk runs when a next button is clicked, the button's purpose being to iterate through the list of texts displayed.
ElseIf firstTimeRun = True Then
welcome += 1
Select Case welcomePages
Case 1
txtDisplay.Text = texts.ngs1
Case 2
txtDisplay.Text = texts.ngs2
Case 3
txtDisplay.Text = texts.ngs3
End Select
I'm wanting to be able to do this without a select case, so that it's essentially
'Pseudo code
ElseIf firstTimeRun = True Then
welcome += 1
txtDisplay.text = texts.ngs(welcome)
I'm not sure how to properly do this, by using a variable in the name of other variables. Any help would be greatly appreciated, thanks!
If you just want to iterate through all this texts, just create a list(of String) or array and add all the ngsX...
As Example:
Dim list as List(Of String)
Dim indexActualShownString as Integer
Then you can just use in your Clicked_Event
txtDisplay.text=list.Items(indexActualShownString) as Integer
indexActualShwonString += 1
But I am not sure if I understand your problem right. And you should also implement a way to reset indexActualShownString, since I dont know what exactly its the purpose of it.

Visual Basic Iterative enabling of Textbox's

Si I'm working on an assignment where I have 10 RadioButtons indicating how many contesters I have, and depending on what I pick between 1 to 10, I need that many of my corresponding TextBoxes to be enabled so I could fill it with names!
Is there a way for me to make a For loop between 1 and the number I picked from the RadioButton and say something like
For i = 0 to Size
{
TextBox&i.Enabled = True
}
Since my TextBoxs are called TextBox1 to TextBox10
I know you can add strings together using &, but how can I do that for an object name?
As of right now I literally have the dumbest way of doing it, which is a click event inside each RadioButton that manually enables the correct number of TextBoxes...
Thank you in advance!
You can iterate over all controls like this:
For Each ctr In Me.Controls
Dim indx As String = ctr.Name
If TypeOf (ctr) Is Textbox Then
' Now compare the name with TextBox&i and do smth
End If
Next
It's not possible to just concatenate a string and use it as an object variable reference like that, but you can search the form's controls by their name property (which is a string) and do it that way. Here's an example:
Private Sub EnableTextBoxes(ByVal Size As Integer)
For i As Integer = 1 To Size
Dim matches() As Control = Me.Controls.Find("Textbox" & i.ToString, True)
If matches IsNot Nothing AndAlso matches.Length = 1 Then matches(0).Enabled = True
Next
End Sub

Adding stuff to listview from textbox

id like to know how to take one of my text boxs or strings and put it in a listview.. well not really let me show u wants going on.
i have a 2 text box with the following stuff
TextBox1
cat123
hatcat
quanwall
samiam12
TextBox2
John
will
sam
dan
i want to take TextBox1's text and put it in one of the columns in the ListView. for example. ListView has 2 columns saying usernames and realnames, and TextBox1 is the usernames and TextBox2 is the realnames. So i want to take each line in TextBox1 to match up with the RealNames(TextBox2) all in ListView.
iv bin using the
Dim Q As New ListViewItem
Q.Text = Host
Q.SubItems.Add(User)
Q.SubItems.Add(Pass)
ListView1.Items.Add(Q)
to add the strings to the listview
I need this information ASAP, Thx u <3
Try this (To listview1 put your listview name)
Dim i As Integer = 0
For Each l In TextBox1.Lines
ListView1.Items.Add(l)
ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(TextBox2.Lines(i))
i += 1
Next
i = 0
While the straightforward answer to your question is rather simple, your posted question raises issues. You are using Listbox and Listview interchangeably, yet they are two different controls. Moreover you seem to suggest your Textbox holds multiple values where the intention of a Textbox is to hold one distinct value or string of text.
As these controls are Windows Forms controls, your use of "Dim Q As New ListviewItem" may not be neccessary.
I would suggest reading up more on the controls you want to use, how they are used and in what context.
The simple straightforward answer to your question could be:
listBox1.Items.Add(textBox1.Text)
For reference: How to: Add and Remove Items with the Windows Forms ListView Control
I'm assuming your user names are stored in TextBox1 and your real names are stored in TextBox2
Public Sub AddListViewItemsFromTextboxes()
Dim Host As String = "SomeHost" 'you mentioned a host in the code snippet in your question, not sure where this comes from
Dim TextBox1String As String = TextBox1.Text
Dim TextBox2String As String = TextBox2.Text
Dim TextBox1Lines() As String = TextBox1String.Split(vbNewLine)
Dim TextBox2Lines() As String = TextBox2String.Split(vbNewLine)
If(TextBox1Lines.Count <> TextBox2Lines.Count)
'possible error handling here
MsgBox("Each user must have both a real name and a username.")
Exit Sub
End If
For NameIndex As Integer = 0 to (TextBox1Lines.Count - 1)
Dim UserName As String = TextBox1Lines(NameIndex)
Dim RealName As String = TextBox2Lines(NameIndex)
Dim Item As New ListViewItem
Item.Text = Host
Dim UserNameSubItem As New ListViewitem.ListViewSubItem
UserNameSubItem.Text = UserName
Item.SubItems.Add(UserNameSubItem)
Dim RealNameSubItem As New ListViewItem.ListViewSubItem
RealNameSubItem.Text = RealName
Item.SubItems.Add(RealNameSubItem)
ListView1.Items.Add(Item)
Next
End Sub
Example GUI:
http://i.stack.imgur.com/du95F.png
EDIT: Added third column

Refer to forms controls using variable

I've seen many threads on this, but I'm pretty much lost.
For the example below, I have 3 ComboBoxes (cbx_example0, cbx_example1, cbx_example2) located on three TabPages (index 0, 1, 2), respectively. I'd like set the value of the variable myVariable based on the ComboBox on the selected TabPage.
However, I can't seem to figure out how to refer to the ComboBox using a variable. It seems like it should be straightforward, but I guess not. No matter what I do, I get a NullReferenceException.
Function to get TabPage Index number (returns 0 for this example)
Function getTabIndex()
Dim currentTabIndex As Int32 = frm_Main.TabControl1.SelectedIndex
Return currentTabIndex
End Function
Attempt 1 to refer to ComboBox with variable
Dim myVariable As String
Dim i As Integer = getTabIndex
myVariable = frm_Main.Controls("cbx_example" & i).Text
Attempt 2 to refer to ComboBox with variable
Dim cbx_example0 As New ComboBox
Dim i As Integer = getTabIndex()
Dim name As String = "cbx_example" & i.ToString
cbx_example = frm_Main.Controls.Item(name)
myVariable = cbx_example.Text
Your problem is that you think that your cbo is located on the form, while in reality it is on the tabpage. Instead of
cbx_example = frm_Main.Controls.Item(name)
use (for example)
cbx_example = frm_Main.TabPage1.Controls.Item(name)
Keep in mind that your combo is probably not on tab itself but on the tabpage
On another note, I see no need for getTabIndex(). And another way to get any control within hierarchy of your form is to use
form.Controls.Find(key, searchAllChildren)