2012-05-14 11 views
5

Soy un novato en C# y visual studio, pero no programando en general. Busqué la respuesta a mi pregunta durante 3 días y encontré muchas, pero por alguna razón extraña (estoy seguro de que me falta algo muy obvio) no puedo hacer que funcione. Creo que es la pregunta más básica que hacen los novatos como yo. Tengo un formulario (Form3) con un cuadro de texto y un botón (lo configuré solo para fines de prueba). Quiero rellenar y leer este cuadro de texto de otra clase. Entiendo que la manera más adecuada de hacer esto es crear una propiedad en Form3.cs con los accesadores GET y SET. Lo hice pero no puedo hacer que funcione. No recibo ningún mensaje de error, pero tampoco puedo establecer el valor del cuadro de texto. Simplemente permanece en blanco. Aquí está mi código de ejemplo:Accediendo al control del formulario desde otra clase C#

namespace WindowsFormsApplication1 
{ 
    public partial class Form3 : Form 
    { 
     public string setCodes 
     { 
      get { return test1.Text; } 
      set { test1.Text = value; } 
     } 

     public Form3() 
     { 
      InitializeComponent(); 
     } 

     private void Form3_Load(object sender, EventArgs e) 
     { } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      a.b(); 
     } 
    } 

    public class a 
    {  
     public static void b() 
     { 
      Form3 v = new Form3(); 
      v.setCodes = "abc123"; 
     } 
    } 
} 

Puede alguien dar una mano para resolver esto?

+1

Es posible que tenga que aprender (o repasar) la idea de la palabra clave 'estática', y cómo funcionan las instancias de los objetos. Si necesita ayuda para encontrar eso, use Google, busque intros básicos de programación orientada a objetos, o pregunte aquí. –

+0

Hola Tim, estás 100% correcto. Necesito presionar la ayuda y aprender a usar la palabra clave estática. Sentí que aquí es donde al menos parte del problema era. -Tony. – Tony

Respuesta

2

Está creando una instancia de marca new Form3().
Esto no afecta el formulario existente.

Debe pasar el formulario como parámetro del método.

5

El problema es que está estableciendo el valor de una nueva instancia del formulario. Intentar algo como esto:

public partial class Form3 : Form { 
    public string setCodes 
    { 
     get { return test1.Text; } 
     set { test1.Text = value; } 
    } 

    private A a; 

    public Form3() 
    { 
     InitializeComponent(); 
     a = new A(this); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    {    
     a.b();    
    } 


    private void Form3_Load(object sender, EventArgs e) 
    { 

    } 
} 

public class A 
{  
    private Form3 v; 

    public a(Form3 v) 
    { 
     this.v = v; 
    } 

    public void b() 
    { 
     v.setCodes = "abc123"; 
    } 
}  
+0

Hola ivowiblo, como dije, soy novato, pero la respuesta a continuación de Enigmativity parece ser un poco menos compleja para mí y realmente funciona. Él no crea una nueva instancia de la clase A en Form3 y solo hay 1 método en la Clase A. Parece que hay tantas respuestas únicas como personas respondiendo. Belleza de internet Gracias por su respuesta, obtuve una perspectiva única de ella. – Tony

+0

Sí. Lo que diría es que C# es un lenguaje orientado a objetos y sugeriré hacer uso de diseños orientados a objetos en lugar de diseños de procedimientos. Como dices, la solución de @Enigmativity hace el trabajo y eso es correcto. Tal vez en su escenario real tenga una situación más compleja y usar un objeto lo hará más fácil (suponga que necesita pasar más cosas, algunas que el formulario no conoce) – ivowiblo

2

Prueba esto:

public partial class Form3 : Form 
{ 
    /* Code from question unchanged until `button1_Click` */ 

    private void button1_Click(object sender, EventArgs e) 
    { 
     a.b(this); 
    } 
} 

public class a 
{  
    public static void b(Form3 form3) 
    { 
     form3.setCodes = "abc123"; 
    } 
} 

Esto pasa la instancia actual de la forma a la otra clase de modo que pueda actualizar la propiedad setCodes. Anteriormente creaba una nueva instancia de formulario en lugar de actualizar el formulario actual.

+0

Hola, esto funcionó muy bien. Realmente aprecio tu ayuda. -Tony. – Tony

-2

Envío instancia de formulario a otra otra clase

Form1 objForm1=new Form1(); 
obj.Validate(objForm1); 

Una forma sencilla de acceder a los controles en otra clase mediante la modificación de los controles Private a Public en la forma (Designer.cs)

+0

¿cómo conseguiste Obj.Validate? – Androidz

Cuestiones relacionadas