This question already has answers here:
How To Get Control Property by "String Name"?
(6 answers)
Closed 9 years ago.
Is there some way in Visual Basic/Studio to find an object using a string?
I want to use it so that i can find objects by concatenating a variable with it.
Something along the lines of:
[Variable & "Main"].Visible = true
Just to elaborate, I don't want to use a table that iterates through all the objects in the form.
This is in VB.net. Any help?
Yes there is a way
Me.Controls(Variable & "Main").Visible = true
See Control.Controls property on MSDN
I don't have any official posting from a Microsoft website, but in my experience this is not possible. I would equate it to trying to use a string as a table name in SQL Server. One option is that you could iterate through the controls on the page (I'm guessing by the .Visible = true that you are dealing with controls) and look for a matching control ID. If found you will then have access to the properties for that control. Let me know if you would like to see an example. I'm not at a pc with Visual Studio so it would not be until tomorrow.
Related
This question already has answers here:
Replace characters in string with values
(3 answers)
Closed 3 years ago.
I'm trying to recall something from my brain from 6 years ago but I can't find it and the standard searches aren't bringing me joy.
I have a label like this:
Hello, this is my label and the value of the thing is: #value#. The label continues for a while here.
I need to update #value# in this instance with something from a database, however I can't remember how to without re-writing all the text again in the code. I know there's a way to do it, does anyone know this?
Thanks in advance!
If you are replacing existing text in the label, something like:
Dim myValueFromDatabase As String = "" ' Get the value from the database here
myLabel.Text = myLabel.Text.Replace("#value#", myValueFromDatabase)
Alternatively, you could use string interpolation:
Dim myValueFromDatabase As String = "" ' Get the value from the database here
myLabel.Text = $"Hello, this is my label and the value of the thing is: {myValueFromDatabase}. The label continues for a while here."
$"Hello, this is my label and the value of the thing is: {value}. The label continues for a while here."
Possible stupid question here...
But is it possible in MS-Access to programmatically manipulate text label captions in such a way that that a different caption will appear in the header of each report section?
Ie., The design view shows a text label object in the GroupLevel zero header, with a default caption of "blah"....but upon execution of a Report_Load() sub, the actual text displayed is different for each section in the report? Say, simply "Section 1", "Section 2', "Section 3" and so on?
My suspicion is that this is not possible, but just wondering if anyone has some creative ideas how to make it work.
I realize that there are other/better ways of accomplishing the same thing...but is such a thing possible using VBA and Label objects specifically (at the moment, this is an external constraint and one that I cant change).
EDIT: https://drive.google.com/open?id=1PID58qMyp_rNxv9tsQk38-Co9sDOFgzY
EDIT 2: Original post specifically designated LABELS as the only object for an acceptable solution. Edit to include LABELS and TEXT BOXES...which of course makes the question nearly trivial. Apologies to #peakpeak for my lack of clarity!
You can change the caption with
Me.<name of header>.Caption = "whatever"
Select Properties for the header in design view and find out and/or change the Name property. Me assumes that the VBA code is located under Microsoft Access Class Objects in the form you want to manipulate.
Actually, thank you for your help, but I have found something that appears to function as a decent work-around within the constraints I described above. Strictly speaking, this does not satisfy the terms of the question as originally asked (-1 to me for lack of clarity, and apologies to #peakpeak, who admittedly had essentially zero chance of answering this question as asked), but it this is close enough that it solves my immediate problem:
Change the object intended to contain my dynamic text from a label to a text box (duh!), keep all formatting settings, etc. the same so that the graphical presentation is unchanged.
Set the Control Source of the new text box to a public function, where the argument of the function is the name of a relevant field in the underlying query ("tName" in the linked example), so that the dynamic text box has a control source "=GetText([tName])" and the GetText() function is defined in the appropriate module for the report, and defines the text as desired, e.g.:
GetText(tName as String) as string
SELECT Case tName
Case "Albert"
GetText = "Section 1"
Case "Barry"
GetText = "Section 2"
Case Else
GetText = "Section 3"
'and so on
End Select
`
End Function
I'm basically trying to create a program that will allow me to use textboxes to input questions and associated answers to test myself. Mostly, I just want to practice some things I've been learning for vb.net while taking an extra step forward.
Here's a mockup:
Any tips on how to do this? What I'm especially not sure about is how to have the textfile save/import work with adding back into comboboxes and making sure the correct questions and answers are associated with one another. I was thinking also that I could have some sort of check when I import a save file that shows me which questions and answers refer to one another
Update on form design:
Some things I'm trying to practice:
Using arrays
Saving/Opening files (text files in this)- in order to import into program
importing into program
Using the progress bar
Having a way to undo entries
Randomizing sort order in the combo box
Maintaining references between variables (like which answer
corresponds with which question) regardless of sort order or using
the undo function
Some posts in stackoverflow I'm thinking of using as reference:
Compare String with Strings in array
Best way to associate two strings of text in VB.NET
Array to combo box?
Update: Trying to be more specific on my question. Basically, I'm trying to use a list to account for all the inputted questions and answers, however I've only used really basic arrays before, like:
val(1) = "test"
val(2) = "this"
val(3) = "string"
Or the kind where you use a For x to z loop. Based on some stackoverflow posts I've gotten to the point where the code works in that (I think?) the list is updated and the combobox for questions and answers reflect what is on the list. However, I can't connect the two so that I can select things in the comboboxes and check if they are correct.
In terms of saving as a text file. I figured it would be simpler. Basically, have it output sort of like
"question goes here" ; "answer goes here"
"next question goes here" ; "answer goes here"
and so on. Then I can use the semicolon as reference in the code when importing. I've never done it before, but it's generally what I do for Microsoft Access or Excel text imports so I figured it was possible.
Code that I have so far (reddit post link): http://redd.it/2716tw
I'm trying to increment specific elements by 1, in order to log results as they come in. I'm trying to read an element, add 1 to it, and then write it back to the same memory address. Why isn't this simple?
In code it would be something as simple as;
array1[element1] = (array1[element1]+1)
or
array1[element1]++
Arrays seem to be either read (indicators) or write (controls)? This is really frustrating, and there's very little help online.
You can use an "Array index/replace" element inside a "In place element structure":
You should use ReplaceArraySubset in the Array palette. For simple replacements, it's much faster than the In Place Element Structure
As an infrequent, novice Labview user I have the same problem ... until I found the code that I used 10 years ago. Surely the answer to sgccarey is:-
Right click on the array control or indicator and 'create local variable'
This variable will appear on the block diagram and can be set as 'Change to Write' or 'Change to Read' as necessary to use as the input and / or output array to a simple 'replace array subset'.
This way the array data only appears once on the Front Panel and is updated as required.
I have no idea if using Local Variables affects runtime efficiency but it works for me. Hope this helps.
This hopefully is a simple question with a simple answer. If I have a list box or something that has a list of like 4 years (like 2006 through 2009), how do I programmatically make variables of these years with names like pTable2006, pTable2007, etc (as ITable of course).
If this isn't possible and I have publicly declared these tables in the declarations (like pTable2006 as ITable, pTable2007 as ITable, etc), how can I programmatically assign these variables based on user choice? What I'm asking is, if the user wants to choose years 2006 and 2007, how can I write this:
pTable & ListBox.Items.Item(0) = [table path string] & ListBox.Items.Item(0)
(please ignore the syntax of the "listbox", I'm just trying to come up with an example)
I hope that makes sense. I'm not sure the best way to ask that, but whenever I put something like pTable & "string", I get an error.
Thanks,
Adrian
I'd consider using a generic dictionary of ITable where "2005" would be the key.
http://adventuresdotnet.blogspot.com/2007/10/vbnet-generic-dictionaries.html