Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. String to Object Instance Problem

String to Object Instance Problem

Scheduled Pinned Locked Moved C#
help
20 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Pete OHanlon

    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

    A Offline
    A Offline
    atoi_powered
    wrote on last edited by
    #11

    The Visual Studio says " ~Control does not contain a definition for Children"!?

    P 1 Reply Last reply
    0
    • A atoi_powered

      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;

      B Offline
      B Offline
      BobJanova
      wrote on last edited by
      #12

      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).

      A 1 Reply Last reply
      0
      • P Pete OHanlon

        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

        B Offline
        B Offline
        BobJanova
        wrote on last edited by
        #13

        It's Controls[^], not Children, in .Net. But yes, this is roughly what I just posted.

        P 1 Reply Last reply
        0
        • B BobJanova

          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).

          A Offline
          A Offline
          atoi_powered
          wrote on last edited by
          #14

          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;
                  }
              }
          
          B 1 Reply Last reply
          0
          • B BobJanova

            It's Controls[^], not Children, in .Net. But yes, this is roughly what I just posted.

            P Offline
            P Offline
            Pete OHanlon
            wrote on last edited by
            #15

            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

            1 Reply Last reply
            0
            • A atoi_powered

              The Visual Studio says " ~Control does not contain a definition for Children"!?

              P Offline
              P Offline
              Pete OHanlon
              wrote on last edited by
              #16

              Replace Children with Controls. 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

              A 1 Reply Last reply
              0
              • P Pete OHanlon

                Replace Children with Controls. 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

                A Offline
                A Offline
                atoi_powered
                wrote on last edited by
                #17

                Mission Done! Thanks a lot :) :)

                P 1 Reply Last reply
                0
                • A atoi_powered

                  Mission Done! Thanks a lot :) :)

                  P Offline
                  P Offline
                  Pete OHanlon
                  wrote on last edited by
                  #18

                  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

                  1 Reply Last reply
                  0
                  • A atoi_powered

                    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;
                            }
                        }
                    
                    B Offline
                    B Offline
                    BobJanova
                    wrote on last edited by
                    #19

                    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;
                    }

                    A 1 Reply Last reply
                    0
                    • B BobJanova

                      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;
                      }

                      A Offline
                      A Offline
                      atoi_powered
                      wrote on last edited by
                      #20

                      Thanks :)

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups