Genericize access to variables
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
Yes, however, you may not like it.
foreach(Control control in Controls){
if(control is Label){
((Label)control).Text = "Something";
}
}Unfortunately this will set all labels. If you are in Windows forms you can use the Tag option to set a tag, or you can subclass your Label control to give it a type. The other option is, after Initialize component, place all Labels you care about looping through in a collection.
Need custom software developed? I do custom programming based primarily on MS tools with an emphasis on C# development and consulting. I also do Android Programming as I find it a refreshing break from the MS. "And they, since they Were not the one dead, turned to their affairs" -- Robert Frost
-
Yes, however, you may not like it.
foreach(Control control in Controls){
if(control is Label){
((Label)control).Text = "Something";
}
}Unfortunately this will set all labels. If you are in Windows forms you can use the Tag option to set a tag, or you can subclass your Label control to give it a type. The other option is, after Initialize component, place all Labels you care about looping through in a collection.
Need custom software developed? I do custom programming based primarily on MS tools with an emphasis on C# development and consulting. I also do Android Programming as I find it a refreshing break from the MS. "And they, since they Were not the one dead, turned to their affairs" -- Robert Frost
Here's a refinement that will only touch all labels you care about:
foreach (Control control in Controls)
{
if (control is Label && label.Name.StartsWith("labelNamePrefixToModifyAsAGroup"))
{
((Label)control).Text = "Something";
}
} -
Here's a refinement that will only touch all labels you care about:
foreach (Control control in Controls)
{
if (control is Label && label.Name.StartsWith("labelNamePrefixToModifyAsAGroup"))
{
((Label)control).Text = "Something";
}
} -
Here's a refinement that will only touch all labels you care about:
foreach (Control control in Controls)
{
if (control is Label && label.Name.StartsWith("labelNamePrefixToModifyAsAGroup"))
{
((Label)control).Text = "Something";
}
}which can be reduced to
foreach (Control c in Controls) if (c.Name.StartsWith("labela")) c.Text = "Something";
as every Control has a Name and a Text property. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.
-
which can be reduced to
foreach (Control c in Controls) if (c.Name.StartsWith("labela")) c.Text = "Something";
as every Control has a Name and a Text property. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.
Slaps self on head for missing that one. :doh:
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
Reference parameters are your friend:
private void SetLabelText(ref Label label, string text)
{
label.Text = text;
}private void SomeFunction()
{
SetLabelText(ref label1, "something1");
SetLabelText(ref label2, "something2");
SetLabelText(ref label3, "something3");
}.45 ACP - because shooting twice is just silly
-----
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997
-----
"The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001 -
Reference parameters are your friend:
private void SetLabelText(ref Label label, string text)
{
label.Text = text;
}private void SomeFunction()
{
SetLabelText(ref label1, "something1");
SetLabelText(ref label2, "something2");
SetLabelText(ref label3, "something3");
}.45 ACP - because shooting twice is just silly
-----
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997
-----
"The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001No need for 'ref', unless you want to change what the label1, label2, and label3 variables point to.
Proud to have finally moved to the A-Ark. Which one are you in?
Author of the Guardians Saga (Sci-Fi/Fantasy novels) -
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
for (int i=1;1<4;i++){
this.Controls[string.Concat("labela", i.ToString())].Text = "something";
}If you have knowledge, let others light their candles at it. Margaret Fuller (1810 - 1850) [My Articles] [My Website]
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
No-one with a LINQ version yet?
class Form1
{
IEnumerable<Control> summingLabels;public Form1() { InitializeComponent(); summingLabels = from c in Controls.Cast().AsQueryable() where c.Name.StartsWith("sumLabel") select c; // later on, when you need them foreach(Control l in summingLabels) l.Text = l.Name; }
}
Keep a pointer around to the controls that you found; no need to iterate them every time :)
I are Troll :suss:
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
The correct answer is: don't do that If you need multiple storage locations (variables) and access them by index, use an array. If you really have multiple variables (e.g. because they are generated by the VS forms designer), then you can still put those into an array:
Label[] labels = { labela1, labela2, labela3 };
-
The correct answer is: don't do that If you need multiple storage locations (variables) and access them by index, use an array. If you really have multiple variables (e.g. because they are generated by the VS forms designer), then you can still put those into an array:
Label[] labels = { labela1, labela2, labela3 };
Hear hear!
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
David Knechtges wrote:
Is there a way to do that?
No, at least if I understand what you want... However, why would you want to do that? What's wrong with:
Label[] labela = {
labela0,
labela1,
labela2,
labela3,
};
//...
for (int i=0;i<4;i++)
labela[i].Text = "something";modified on Wednesday, September 1, 2010 5:55 PM
-
David Knechtges wrote:
Is there a way to do that?
No, at least if I understand what you want... However, why would you want to do that? What's wrong with:
Label[] labela = {
labela0,
labela1,
labela2,
labela3,
};
//...
for (int i=0;i<4;i++)
labela[i].Text = "something";modified on Wednesday, September 1, 2010 5:55 PM
This answer was already posted hours ago.
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
You can also try reflection if you really really really really really really really really must do it this way and not using array/collection (depending on a situation).
Don't forget to rate answer, that helped you. It will allow other people find their answers faster.
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
Try to use this construction:
this.GetType().GetField("variablename")
This should work for c# but better try to avoid such kind of code. Other languages has different RTTI, for example in c/c++ this is impossible at all.
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
Not sure about the performance implications of FindControl.. But this one is pretty close to what you originally wrote
for (int i=1;i<4;i++)
(Controls.FindControl("labela" + i.ToString()) as Label).Text = "something"; -
No-one with a LINQ version yet?
class Form1
{
IEnumerable<Control> summingLabels;public Form1() { InitializeComponent(); summingLabels = from c in Controls.Cast().AsQueryable() where c.Name.StartsWith("sumLabel") select c; // later on, when you need them foreach(Control l in summingLabels) l.Text = l.Name; }
}
Keep a pointer around to the controls that you found; no need to iterate them every time :)
I are Troll :suss:
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
This is not exactly what you were asking for but is an alternative using binding. This may be overkill for what you are trying to do but it would be more elegant. Bind your labels as you create them to an object of a class that implements INotifyChanged then when you change the property of the object each label will be updated without having to work loops. http://stackoverflow.com/questions/639894[^] Dave
-
I googled this extensively yesterday and didn't come out with an answer: Is it possible to do some thing like this, and if so how? labela1.Text = "something"; labela2.Text = "something"; labela3.Text = "something"; Now what I want is a way to write that code as say: for (int i=1;i<4;i++) labelai.Text = "something"; so that the i in labelai above is replaced by 1, 2, 3 at runtime and the net result of the for loop is the same as what happens in the block above. Is there a way to do that? Thanks!
Array.ForEach(new Control[] { labela1, labela2, labela3 }, delegate(Control c) { c.Text = "something"; });