none
Cambiar la propiedad .Image de un picturebox desde una class RRS feed

  • Pregunta

  • Hola amigos... como puedo cambiar la imagen de un picturebox desde un class, he intentado con

    MainDark Maindark = new MainDark();

    ((Picturebox)Maindark.Controls["Avatar"]).Image = Resources.Avatar1;

    //Me dice que no establecida como instancia de un objeto

    Probe tambien poniendo publico el Picturebox y desde el class

    MainDark Maindark = new MainDark();

    Maindark.Avatar.Image = Resources.Avatar1;

    //Este no me da error pero no me hace ningun cambio

    Si pudieran ayudarme de antemano gracias



    • Editado Hackerprod sábado, 23 de junio de 2018 13:00
    sábado, 23 de junio de 2018 12:59

Respuestas

  • Yo haria los siguientes cambios.

    1) La llamada. En lugar de instanciar el form asi:

    AvatarName photo = new AvatarName();

    Instancialo asi:

    AvatarName photo = new AvatarName(this);

    2) Agregar un canstructor en la clase AvatarName para que reciba el dato pasado:

    private MainDark llamante;

    public AvatarName(MainDark remitente) { this.llamante = remitente; }

    3) Quitar en el metodo Hero esta linea:

    MainDark Maindark = new MainDark();   

    4) Hacer el acceso al picturebox a traves de la variable pasada desde el form llamante:

    llamante.Avatar.Image = ....


    lunes, 25 de junio de 2018 15:45
    Moderador

Todas las respuestas

  • El error gordísimo está aquí:

    MainDark Maindark = new MainDark();

    Cuando haces un "new" del form, se crea un nuevo form, que no se ve en pantalla mientras no le hagas un Show(). Esta es una nueva instancia del form, que no es la misma que se encuentra visible en pantalla y que es la que contiene el PictureBox que quieres cargar. La instancia invisible contiene también su propio picturebox, pero seguramente no ha sido inicializado, por lo que te salen errores cuando intentas cambiar su imagen, y aunque no te salgan errores, no te vale para nada, porque el form sigue siendo invisible y no se ve lo que hayas cargado en su picturebox.

    Así que no puedes conseguir lo que quieres instanciando de nuevo el form. Tienes que usar la misma instancia que se encuentra visible en pantalla. Eso implica que previamente tienes que hacerle llegar esa instancia a la clase desde la que quieres llamarla. La clase no puede recuperarla por sí sola.

    Si la clase la has instanciado desde el propio form, puedes pasarle el this, que es una referencia a sí misma y a través de esa referencia puedes llamar al .Avatar de esa variable.

    Si la clase la has instanciado desde otro sitio, por ejemplo, haciendo en algún otro lugar esto:

    MainDark miFormulario = new MainDark(); miFormulario.Show();

    Pues entonces esa variable "miFormulario" tienes que hacérsela llegar a la clase por el método que quieras (pasándosela en el constructor, o en una propiedad, o como argumento de un método, o haciéndola pública y estática en otro sitio). Y una vez que la clase la reciba, puede llamar a miFormulario.Avatar.Image=loQueSea.

    sábado, 23 de junio de 2018 16:25
    Moderador
  • Disculpa mi ignorancia Alberto... es que no me ha quedado claro del todo...

    mira tengo el Form llamado MainDark, en este tengo un picturebox(Avatar)

    desde el llamo a la clase de la siguiente forma

    AvatarName photo = new AvatarName();
    photo.Hero("Avatar1");

    y en la clase

    public String Hero(string name)
    {
          

           MainDark Maindark = new MainDark();   

        if { name == "Avatar1"}
        ((Picturebox)Maindark.Controls["Avatar"]).Image = Resources.Avatar1;   

           if { name == "Avatar2"}
        ((Picturebox)Maindark.Controls["Avatar"]).Image = Resources.Avatar2;

        //Y asi consecutivamente
    }

    Disculpa los errores, lo hice en este momento a mente...

    Amigo si lo fueras a hacer como lo harías... ponme el ejemplo. Saludos y de antemano gracias...

    lunes, 25 de junio de 2018 15:33
  • Yo haria los siguientes cambios.

    1) La llamada. En lugar de instanciar el form asi:

    AvatarName photo = new AvatarName();

    Instancialo asi:

    AvatarName photo = new AvatarName(this);

    2) Agregar un canstructor en la clase AvatarName para que reciba el dato pasado:

    private MainDark llamante;

    public AvatarName(MainDark remitente) { this.llamante = remitente; }

    3) Quitar en el metodo Hero esta linea:

    MainDark Maindark = new MainDark();   

    4) Hacer el acceso al picturebox a traves de la variable pasada desde el form llamante:

    llamante.Avatar.Image = ....


    lunes, 25 de junio de 2018 15:45
    Moderador
  • Perfecto hermano... muchas gracias!!!
    martes, 26 de junio de 2018 15:11