Clear Multiple Textbox at Once - vb.net

I have the following textboxes and want to delete them faster.
TxtDrawA1.Clear
TxtDrawA2.Clear
TxtDrawA3.Clear
TxtDrawA4.Clear
TxtDrawA5.Clear
TxtDrawA6.Clear
TxtDrawA7.Clear
TxtDrawA8.Clear
and so on...

Here is how to find them no matter what container they are in (they can all even be in different containers). This approach also demonstrates how to get those controls "in order":
Dim tb As TextBox
Dim ctl As Control
For i As Integer = 1 To 8
ctl = Me.Controls.Find("TxtDrawA" & i, True).FirstOrDefault
If Not IsNothing(ctl) AndAlso TypeOf (ctl) Is TextBox Then
tb = DirectCast(ctl, TextBox)
' ... do stuff with "tb" ...
tb.Clear()
End If
Next

Hello and welcome to StackOverflow!
You could try iterating through the textboxes like this:
For Each txtb As TextBox In Me.Controls.OfType(Of TextBox)()
If txtb.Name.StartsWith("TxtDrawA")
txtb.Clear
End If
Next
Hope this helps!

Related

How do I efficiently pair Toggle Buttons and Textboxes in Access Form?

I know the title is a bit confusing so let me make myself as clear as possible.
In an Access form (2010), I have a set of text fields meant to contain dates. Those fields are all optional, the user can fill in any number of dates.
To make it more user-friendly, I want to associate each field to a toggle button. Then I want 2 things to happen :
On CURRENT event :
If a text field has a value, then it is visible and the toggle button
associated with it is pressed.
If a text field is empty, then it is not visible and the toggle button isn't pressed.
On CLICK of a toggle button :
If the text field associated with it has a value, then this field gets cleared (and invisible) and the toggle button gets de-pressed ;
If the text field associated with it is empty, then the focus is set on it and the toggle button gets pressed (and stay that way if a value is entered in the text field, otherwise everything gets back the way it was, invisible and unpressed).
So far I've achieved the first step by setting two collections of controls based on some examples I found online.
So, when the form is loaded, I call this :
Private mcolGroupTxToggle As New Collection
Private mcolGroupBuToggle As New Collection
Private Sub InitializeCollections()
Dim ctl As Control
If mcolGroupTxToggle.Count = 0 Then
For Each ctl In Me.Controls
If ctl.Tag = "txtoggle" Then
mcolGroupTxToggle.Add ctl, ctl.Name
End If
Next ctl
Set ctl = Nothing
End If
If mcolGroupBuToggle.Count = 0 Then
For Each ctl In Me.Controls
If ctl.Tag = "butoggle" Then
mcolGroupBuToggle.Add ctl, ctl.Name
End If
Next ctl
Set ctl = Nothing
End If
End Sub
And on Form_Current event, I call that :
Private Sub OnLoadToggles(mcol As Collection, pcol As Collection)
Dim ctl As Control
Dim btn As Control
Dim strBtn As String
For Each ctl In mcol
'Every button has the same name than the textbox + "b"
strBtn = ctl.Name & "b"
For Each btn In pcol
If btn.Name = strBtn Then
If IsNull(ctl) Then
ctl.Visible = False
btn.Value = False
Else
ctl.Visible = True
btn.Value = True
End If
End If
Next btn
Next ctl
Set ctl = Nothing
End Sub
Everything works well so far, but I'm not sure that's the best way to do it and I figured I would need to repeat some lines in step 2.
Making the distinction between text boxes and buttons in the procedure seems weird, I feel like it should be done prior so that I don't have to do it in every procedure. I also feel like it would be better to loop through each pair of controls (text + button) instead of each control in both collections.
Basically, I'm wondering if it would be (1) better and (2) possible to have something as simple as this :
Private Sub OnLoadToggles(Collection of pairs)
for each [pair of txt and btn]
if isnull(txt) Then
txt.visible = false
btn.value = false
else
...
end if
...
My guess is that I would need to make a public sub where I set a collection of pairs of buttons and text fields based on their tags (there are other controls in my form that need to be left alone) and names, but I'm not sure how, I'm a beginner in VBA.
Any suggestions please ?
-- Edit step 2 --
Thanks to Andre's answer the second part was easier than I thought. I've updated my sample database. So on click events I call this :
Private Sub ClickToggles()
Dim ctl As Control
Dim btn As Control
Dim strBtn As String
Dim strCtl As String
strBtn = Me.ActiveControl.Name
strCtl = Left(strBtn, Len(strBtn) - 1)
Set ctl = Me(strCtl)
Set btn = Me(strBtn)
If IsNull(ctl) Then
btn.Value = True
ctl.Visible = True
ctl.Enabled = True
ctl.SetFocus
Else
ctl.Value = ""
btn.Value = False
ctl.Visible = False
End If
End Sub
It's not perfect but it works. Probably not a good idea to clear the data at this point because misclicks may happen. It would be better to loop through the textboxes right before saving the form and clear values of invisible and/or disabled controls from the collection. I might to that later.
I had to add the .enabled property next to the .visible one because on lostfocus events I was getting an error saying the control was still active so it couldn't make it not visible.
Right now I'm more concerned about the amount of click and lost focus events. I'd rather have some public functions and event handlers dealing with it but it's getting too complicated for me. I'll get back to it when I know more about... everything.
Suggestions are still welcome anyway =) !
Since your control pairs are "paired" by their name anyway, you don't need any fancy constructs, or even the second collection. Just address the matching control directly by its name.
Instead of using If/Else for setting boolean properties, it is usually easier to assign a variable to the property.
Private Sub OnLoadToggles(mcol As Collection)
Dim ctl As Control
Dim btn As Control
Dim strBtn As String
Dim bShowIt As Boolean
For Each ctl In mcol
'Every button has the same name than the textbox + "b"
strBtn = ctl.Name & "b"
' If you have the control name, you can get the control directly:
Set btn = Me(strBtn)
' Using a variable you don't need If/Else
bShowIt = Not IsNull(ctl.Value)
ctl.Visible = bShowIt
btn.Value = bShowIt
Next ctl
' Note: this is not necessary for local variables - they go automatically out of scope
Set ctl = Nothing
End Sub

How to loop through groupbox in vb.net

In my VB.NET form I have 50 groupboxes, each containing a combobox named volt. I used this code to add value to all the comboboxes:
For count = 1 To 50
Dim volt = DirectCast(Me.Controls("volt" & count & ""), ComboBox)
volt.Items.Add("what a code")
Next
but they were placed in different groupbox. When I rewrite it like this:
For count = 1 To 50
Dim volt = DirectCast(groupbox1.Controls("volt" & count & ""), ComboBox)
volt.Items.Add("what a code")
Next
it works in in only groupbox1. How can I make affect the remaining groupboxes?
Something like this might work for you (jmcilhinney suggestion actually):
For Each ctl As Control In Me.Controls
For Each cmb As Combobox In ctl.Controls.OfType(Of Combobox)()
cmb.Text = "Volt"
Next
Next
But be careful with this - If your Groupboxes are in a container such as Panel or Split Container do a loop inside that and not In Me.Controls.

Highlight sets of matches within textbox

Upon first inspection, I surmised this would be a straightforward task (maybe it still is!), yet I am having difficulty. Suppose I have a form with 1000 textboxes, where each textbox contains randomly distributed, yet in many cases matching strings. For example, the below may be found in any one if the 1000 textboxes:
AAAA-XXXX
AAAA-XXXX
BBBB-XXXX
BBBB-XXXX
CCCC-XXXX
CCCC-XXXX
...
How might I loop through the textboxes, identify all the matching examples and highlight the textbox.backcolor where the matches occur? The backcolor should be the same for the exact matches, yet different for each unique set of matches. There could be as many as 100 different sets!
Just whipped together a working test project, this is the kind of approach I'd take. It avoids comparing every textbox to every other textbox. I've commented it all up for you :)
Private Sub SetBoxColors()
'The keys are textbox texts, the values are the number of times it occurs
Dim UniqueTextsAndUsage As New Dictionary(Of String, Integer)
Dim FirstInstanceTextBoxes As New List(Of TextBox)
'The keys are textbox texts, the values are the colour for the box
Dim UniqueColors As New Dictionary(Of String, System.Drawing.Color)
'Iterate over all the text boxes
' Substitute Me for your Form instance if necessary
For Each TBox As Control In Me.Controls
'Skip things that aren't textboxes
If Not TypeOf TBox Is TextBox Then
Continue For
End If
'If we have seen this textbox text before
If UniqueTextsAndUsage.ContainsKey(TBox.Text) Then
'Increase the usage
UniqueTextsAndUsage(TBox.Text) += 1
If UniqueTextsAndUsage(TBox.Text) = 2 Then
'This is the second usage, generate a colour for this set of boxes
UniqueColors.Add(TBox.Text, GenerateColor(UniqueColors.Count + 1))
End If
'Colour this textbox
' (it won't get the first instance of each unique string)
TBox.BackColor = UniqueColors(TBox.Text)
Else
'We have NOT seen this textbox text before
'Add the first occurence of the text
UniqueTextsAndUsage.Add(TBox.Text, 1)
'Mark this textbox as one we may have to colour later
FirstInstanceTextBoxes.Add(TBox)
End If
Next
'Colour all the first instances
For Each TBox As TextBox In FirstInstanceTextBoxes
'Check there are sufficient uses of this text
If UniqueTextsAndUsage(TBox.Text) > 1 Then
TBox.BackColor = UniqueColors(TBox.Text)
End If
Next
End Sub
Private Function GenerateColor(Id As Integer) As System.Drawing.Color
'Needs more thought - often too dark
Dim KnownColourByIdNumber As System.Drawing.KnownColor = Id
Return System.Drawing.Color.FromKnownColor(KnownColourByIdNumber)
End Function
The GenerateColor function needs more thought so that it generates some nicer colours but I leave that to you.
You may also need a reset that sets every box to the DefaultControl color or whatever it's called, and run that at the top of SetBoxColors.
You can do this
Dim strText As String
For Each TextBox1 As System.Windows.Forms.TextBox In Me.Controls
strText = TextBox1.Text
For Each TextBox2 As System.Windows.Forms.TextBox In Me.Controls
If strText = TextBox2.Text AndAlso TextBox2.Name <> TextBox1.Name Then
TextBox2.BackColor = Color.Red ' or whatever you want to use
TextBox1.BackColor = Color.Red
End If
Next
Next

Iterate over non-sequentially named text boxes

I have 44 text boxes on a screen (to be precise, RadNumericTextBoxes but that's not germane). They follow a common naming pattern (rntb_[NameOfDBField]) which can't be programmatically replicated.
How can I set .Value to Nothing for each control which has a name ^= rntb_? I have attempted the following:
Private Sub ClearValues()
For Each c as Control in Controls
If TypeOf c Is RadNumericTextBox Then
TryCast(c, RadNumericTextBox).Value = Nothing
End If
Next
End Sub
However, Controls.Count = 1 and contains just the name of the master page.
Do I need to pass an argument to Controls, or do I need to do something else altogether? It's "only" 44 text boxes so I could clear each one manually but I'd rather do it programmatically if possible.
If the RadNumericTextBoxes are on the Form and not in a container, then something along the lines of
Private Sub ClearValues()
For Each c As Control In Me.Controls
If TypeOf c Is RadNumericTextBox Then
Dim rntb = DirectCast(c, RadNumericTextBox)
If rntb.Name.StartsWith("rntb_") Then
rntb.Value = Nothing
End If
End If
Next
End Sub
But if they are in, say, GroupBox1 then you would replace Me.Controls in the above with GroupBox1.Controls.
And what is the End For in your code? A For..Next loop has Next at the end of its body in VB.NET.

ms-access: clear text in all controls with one click

i have some comboboxes and some textboxes on a form
i would like to clear all of them with one line of code. is that possible?
something like all_controls.text=""
Not with one line of code. You will have to walk through all of the controls with a loop.
Dim ctl As Control
For Each ctl In Me.Controls
If (ctl.ControlType = acTextBox) Then
ctl.Value = Null
End If
Next ctl
http://www.tek-tips.com/faqs.cfm?fid=5010