String to Object Instance Problem
-
Here's the real problem: I have 81 pictureBoxes and I want to change their BackgroundImage at once. I'm looking for a solution to stay away from writing 81 statements. I need a code snippet to do so.
Are you trying to convert them into the same image?
*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
-
Are you trying to convert them into the same image?
*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
Yes. I'm trying to reach something like this:
for (Counter = 1; Counter <= 81; Counter++)
{
picturebox|COUNTER|.BackgroundImage = Resource1.Img1;
} -
Yes. I'm trying to reach something like this:
for (Counter = 1; Counter <= 81; Counter++)
{
picturebox|COUNTER|.BackgroundImage = Resource1.Img1;
}Off the top of my head, I would possibly use something like this:
private void ChangePictureBoxes(Control parentControl, Image img)
{
foreach (Control control in parentControl.Children)
{
PictureBox picture = control as PictureBox;
if (picture != null)
{
picture.BackgroundImage = img;
continue;
}
// Loop through the children - just in case the pictureboxes
// are in other control containers.
ChangePictureBoxes(control);
}
}*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
-
Off the top of my head, I would possibly use something like this:
private void ChangePictureBoxes(Control parentControl, Image img)
{
foreach (Control control in parentControl.Children)
{
PictureBox picture = control as PictureBox;
if (picture != null)
{
picture.BackgroundImage = img;
continue;
}
// Loop through the children - just in case the pictureboxes
// are in other control containers.
ChangePictureBoxes(control);
}
}*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
The Visual Studio says " ~Control does not contain a definition for Children"!?
-
Off the top of my head, I would possibly use something like this:
private void ChangePictureBoxes(Control parentControl, Image img)
{
foreach (Control control in parentControl.Children)
{
PictureBox picture = control as PictureBox;
if (picture != null)
{
picture.BackgroundImage = img;
continue;
}
// Loop through the children - just in case the pictureboxes
// are in other control containers.
ChangePictureBoxes(control);
}
}*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
-
Hi, I wanted to use these statements to convert a string to an object instance but it gave me this error: ------------------------------- An unhandled exception of type 'System.ArgumentNullException' occurred in mscorlib.dll Additional information: Value cannot be null. ------------------------------- I'm fully sure that I wrote the string phrase right but I don't know for what purpose this error comes. Here's the code:
Type t = Type.GetType("pictureBox99." + "BackgroundImage");
PictureBox picture = Activator.CreateInstance(t) as PictureBox;
picture.BackgroundImage = Resource1.island;Okay, I've read this whole thread and you're horribly confused about classes and instances. Your user name indicates you come from non-class-based procedural languages, and perhaps you need to keep the Object Oriented chapter of your C# book open while you learn! The failed code that you are trying here is trying to find a type, and create a new instance of that type. Activator.CreateInstance(sometype) is logically equivalent to new sometype(), and in fact the snippet you posted can be written exactly as
PictureBox picture = new pictureBox99.BackgroundImage();
picture.BackgroundImage = Resource1.island;Hopefully you can see why that doesn't work! You are not trying to create a copy of something whose final type is not known at compile time, which is about the only time I've needed to use reflection based instantiation. No, what you want to do is find all the instances and do the same thing to them:
foreach(Control c in Controls){
PictureBox picture = c as PictureBox;
if(picture != null)
picture.BackgroundImage = Resource1.island;
}or with Linq:
this.Controls.Select(c => c as PictureBox).Where(c => c != null).ToList().ForEach(pb => pb.BackgroundImage = Resource1.island);
(the ToList being necessary because ForEach isn't defined except on Lists).
-
Okay, I've read this whole thread and you're horribly confused about classes and instances. Your user name indicates you come from non-class-based procedural languages, and perhaps you need to keep the Object Oriented chapter of your C# book open while you learn! The failed code that you are trying here is trying to find a type, and create a new instance of that type. Activator.CreateInstance(sometype) is logically equivalent to new sometype(), and in fact the snippet you posted can be written exactly as
PictureBox picture = new pictureBox99.BackgroundImage();
picture.BackgroundImage = Resource1.island;Hopefully you can see why that doesn't work! You are not trying to create a copy of something whose final type is not known at compile time, which is about the only time I've needed to use reflection based instantiation. No, what you want to do is find all the instances and do the same thing to them:
foreach(Control c in Controls){
PictureBox picture = c as PictureBox;
if(picture != null)
picture.BackgroundImage = Resource1.island;
}or with Linq:
this.Controls.Select(c => c as PictureBox).Where(c => c != null).ToList().ForEach(pb => pb.BackgroundImage = Resource1.island);
(the ToList being necessary because ForEach isn't defined except on Lists).
look here:
private void ResetPictureBoxes()
{
pictureBox9.BackgroundImage = Resource1.sea;
pictureBox40.BackgroundImage = Resource1.sea;
pictureBox1.BackgroundImage = Resource1.sea;
pictureBox100.BackgroundImage = Resource1.sea;
pictureBox101.BackgroundImage = Resource1.sea;
pictureBox102.BackgroundImage = Resource1.sea;
pictureBox103.BackgroundImage = Resource1.sea;
pictureBox104.BackgroundImage = Resource1.sea;
pictureBox105.BackgroundImage = Resource1.sea;
pictureBox13.BackgroundImage = Resource1.sea;
pictureBox14.BackgroundImage = Resource1.sea;
pictureBox15.BackgroundImage = Resource1.sea;
pictureBox16.BackgroundImage = Resource1.sea;
pictureBox17.BackgroundImage = Resource1.sea;
pictureBox18.BackgroundImage = Resource1.sea;
pictureBox19.BackgroundImage = Resource1.sea;
pictureBox2.BackgroundImage = Resource1.sea;
pictureBox20.BackgroundImage = Resource1.sea;
pictureBox21.BackgroundImage = Resource1.sea;
// AND SO ON
}I try your code snippet, too but it didn't work.
private void ResetPictureBoxes()
{
foreach (Control c in this.Controls)
{PictureBox picture = c as PictureBox; if (picture != null) picture.BackgroundImage = Resource1.island; } }
-
Thanks - I just knocked this up in the CP editor.
*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
-
The Visual Studio says " ~Control does not contain a definition for Children"!?
Replace
Children
withControls
. I just knocked this snippet up in the CP editor.*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
-
Replace
Children
withControls
. I just knocked this snippet up in the CP editor.*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
Mission Done! Thanks a lot :) :)
-
Mission Done! Thanks a lot :) :)
No problem. The key to this trick is the fact that your control could be nested inside any one of a number of control containers - this recursive method is a handy way to iterate over a form and find ALL instances of a particular type.
*pre-emptive celebratory nipple tassle jiggle* - Sean Ewington
"Mind bleach! Send me mind bleach!" - Nagy Vilmos
CodeStash - Online Snippet Management | My blog | MoXAML PowerToys | Mole 2010 - debugging made easier
-
look here:
private void ResetPictureBoxes()
{
pictureBox9.BackgroundImage = Resource1.sea;
pictureBox40.BackgroundImage = Resource1.sea;
pictureBox1.BackgroundImage = Resource1.sea;
pictureBox100.BackgroundImage = Resource1.sea;
pictureBox101.BackgroundImage = Resource1.sea;
pictureBox102.BackgroundImage = Resource1.sea;
pictureBox103.BackgroundImage = Resource1.sea;
pictureBox104.BackgroundImage = Resource1.sea;
pictureBox105.BackgroundImage = Resource1.sea;
pictureBox13.BackgroundImage = Resource1.sea;
pictureBox14.BackgroundImage = Resource1.sea;
pictureBox15.BackgroundImage = Resource1.sea;
pictureBox16.BackgroundImage = Resource1.sea;
pictureBox17.BackgroundImage = Resource1.sea;
pictureBox18.BackgroundImage = Resource1.sea;
pictureBox19.BackgroundImage = Resource1.sea;
pictureBox2.BackgroundImage = Resource1.sea;
pictureBox20.BackgroundImage = Resource1.sea;
pictureBox21.BackgroundImage = Resource1.sea;
// AND SO ON
}I try your code snippet, too but it didn't work.
private void ResetPictureBoxes()
{
foreach (Control c in this.Controls)
{PictureBox picture = c as PictureBox; if (picture != null) picture.BackgroundImage = Resource1.island; } }
Define 'didn't work'. Are all your picture boxes children of the same control? If so, you should use 'parentOfPBs.Controls' not 'this.Controls'. If not, you will have to traverse the whole control tree; I suggest you do this once and stash them in a list as it can be quite slow on a big form. You can use a standard recursive tree traversal similar to
public static List<T> GetControlsInTree<T>(Control parent) where T: Control {
List<T> result = new List<T>
AddControlsInTree(parent, result);
return result;
}static void AddControlsInTree<T>(Control parent, List<T> list) where T: Control {
foreach (Control c in parent.Controls){
T t = c as T;
if (t != null) list.Add(t);
AddControlsInTree(c, list);
}
}You can stash the list of picture boxes after form initialisation (after you call InitializeComponent in the constructor, for example):
List<PictureBox> pictures = GetControlsInTree<PictureBox>(this);
Then you can iterate over them at will:
private void ResetPictureBoxes()
foreach(PictureBox picture in pictures)
picture.BackgroundImage = Resource1.island;
} -
Define 'didn't work'. Are all your picture boxes children of the same control? If so, you should use 'parentOfPBs.Controls' not 'this.Controls'. If not, you will have to traverse the whole control tree; I suggest you do this once and stash them in a list as it can be quite slow on a big form. You can use a standard recursive tree traversal similar to
public static List<T> GetControlsInTree<T>(Control parent) where T: Control {
List<T> result = new List<T>
AddControlsInTree(parent, result);
return result;
}static void AddControlsInTree<T>(Control parent, List<T> list) where T: Control {
foreach (Control c in parent.Controls){
T t = c as T;
if (t != null) list.Add(t);
AddControlsInTree(c, list);
}
}You can stash the list of picture boxes after form initialisation (after you call InitializeComponent in the constructor, for example):
List<PictureBox> pictures = GetControlsInTree<PictureBox>(this);
Then you can iterate over them at will:
private void ResetPictureBoxes()
foreach(PictureBox picture in pictures)
picture.BackgroundImage = Resource1.island;
}Thanks :)