none
Como escribir en un textbox desde otra clase? RRS feed

  • Pregunta

  • hola amigos les cuento que soy nuevo en el foro y tambien en la programacion c# pero me doy maña, necesito de su ayuda, paso a desarrollar un poco mas mi pregunta, resulta que estoy trabajando con una aplicacion windows forms, al crear la aplicacion windows forms me crea una clase por defecto llamada form1, paso siguiente agrego un control textbox desde la ventana de diseño, luego en la clase form1 escribo textBox1.Text = "hola mundo; hasta ahi todo perfecto.

    El problema me surge al crear una segunda clase llamada clase2 en otro documento en el mismo proyecto, intento escribir en el textobox y no se puede, e creado un objeto de la clase form1, tambien e puesto el modificador de acceso del textbox en publico, y tambien e puesto que clase2 derive de form1 y no a funcionado, es posible utilizar los controles agregados desde la ventana de diseño y usarlos desde otras clases que no sea la clase por defecto form1?

    Espero haber sido lo mas claro posible, y desde ya muchas gracias, quedo atento a sus respuestas



    viernes, 6 de marzo de 2020 11:45

Respuestas

  • Hola Ezero

    Tiene razón Leandro no es algo bueno ni natural acceder a un control WinForms desde una clase (excepto que esa clase sea un form hijo), pero si queres saber como se haría eso, es declarar el control public y pasarle a la clase una referencia al form, y ahí si podrías cometer ese error.

    // todo lo que sigue no hay que hacerlo

    // dentro de Clase1

    private Form1 form;

    // en el constructor de Clase1

    public Clase1(Form1 form) {

        this.form = form;

    }

    // instancio Clase1

    Clase1 objeto = new Clase1(form);  // le pasas una ref. del form al objeto de tu clase

    // en algún método de Clase1

    this.form.textBox1.Text = "Todo este procedimiento está muy mal";

    Saludos

    Pablo

    viernes, 6 de marzo de 2020 17:01

Todas las respuestas

  • No se si te he entendido bien pero si creas un objecto de form1 lo único que tienes que hacer es asignarle el valor a su propiedad TextBox1.Text.

    Algo como

    oForm form1 = new form1();
    oForm.TextBox1.Text = "Algo";


    Saludos, Javier J

    viernes, 6 de marzo de 2020 11:50
  • hola

    >>luego en la clase form1 escribo textBox1.Text = "hola mundo; hasta ahi todo perfecto.

    Aclaremos que form1 no es una clase normal, es una que hereda de Form por lo tanto representa visualmente componente de forma la UI

    >>al crear una segunda clase llamada clase2 en otro documento en el mismo proyecto

    Que tipo de class es esta? es una clase normal o es otro form?

    Ademas mencionas "otro documento", que seria eso? te refieres a un nuevo .cs

    >>intento escribir en el textobox y no se puede

    pues claro, el textbox lo defines en el form1 no en esta nueva clase

    >>es posible utilizar los controles agregados desde la ventana de diseño y usarlos desde otras clases que no sea la clase por defecto form1?

    Si, pero no debes hacerlo

    El acceso a controles del form desde otro sitio no es buena practica ya que rompes la encapsulacion

    La idea es que definas un metodo public en el form1 para realizar acciones, pero en la clase debes pasar la instancia que ya tienes del form1, si usas el new estas creando una nueva, por eso aunque apliques acciones no vas a ver reflejados los cambios

    lo que aconsejaria es que desde la clase2 devuelvas la info que usara el form1 y no accedas a objetos cruzados

    public class Form1 : Form{
    
        public void button1_Click(...){
    
              clase2 c = new clase2();
              textbox1.Text = c.Metodo1();
    
       }
    }


    la idea es que la clase2 retorna el dato que asignas en el textbox del form1

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 6 de marzo de 2020 13:32
  • Gracias javier y leandro por su tiempo, la primera respuesta no me funciono, con la segunda me quedo mas claro, perdona leandro, se que no es buena practica lo que intento hacer y rompe el encapsulamiento, pero de todos modos me gustaria saber cual es la forma de definir el textbox en ambas clases a la ves, osea (clase form1 por defecto) y la (clase2), porque e intentado de muchas formas pero no logro dar en el clavo y que el textbox sea utilizable en la clase2 como si fuese la clase por defecto form1.

    Por cierto la clase2 que agrego es una clase comun osea haciendo click derecho sobre el proyecto y en agregar nuevo elemento clase.

    viernes, 6 de marzo de 2020 14:13
  • Hola Ezero

    Tiene razón Leandro no es algo bueno ni natural acceder a un control WinForms desde una clase (excepto que esa clase sea un form hijo), pero si queres saber como se haría eso, es declarar el control public y pasarle a la clase una referencia al form, y ahí si podrías cometer ese error.

    // todo lo que sigue no hay que hacerlo

    // dentro de Clase1

    private Form1 form;

    // en el constructor de Clase1

    public Clase1(Form1 form) {

        this.form = form;

    }

    // instancio Clase1

    Clase1 objeto = new Clase1(form);  // le pasas una ref. del form al objeto de tu clase

    // en algún método de Clase1

    this.form.textBox1.Text = "Todo este procedimiento está muy mal";

    Saludos

    Pablo

    viernes, 6 de marzo de 2020 17:01
  • Que crack pablo, al fin resolvi mi duda, pese a que es un procedimiento malo hacerlo de esa forma, nunca esta de mas saberlo, pero logicamente tratare de evitarlo, muchas gracias!!!
    viernes, 6 de marzo de 2020 18:04
  • hola

    >>pero de todos modos me gustaria saber cual es la forma de definir el textbox en ambas clases a la ves

    tienes mal un concepto, no defines un textbox en ambas clases, lo defines en una y luego accedes a la referencia desde la otra clase

    pero la instancia es solo una

    Si en la clase2 agregas la librerias de winforms podrias hacer

    public class clase2{
    
       private readonly TextBox _textbox1;
    
        public clase2(TextBox textbox1){
           _textbox1 = textbox1;
       }
    
       public void xxMetodo(){
            _textbox1.Text = "Mensaje";
       }
    
    }

    de esta forma desde el form1 pasas la refencia del control a la clase2, entonces desde el form1 usarias

    clase2 c = new clase2(textbox1);
    
    c.xxMetodo();


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 6 de marzo de 2020 19:07