18 votos

¿Cómo acceder a los métodos y controles de un formulario desde una clase en C#?

Estoy trabajando en un programa en C#, y ahora mismo tengo una Form y un par de clases. Me gustaría poder acceder a algunos de los Form controles (como un TextBox ) de mi clase. Cuando intento cambiar el texto en el TextBox de mi clase obtengo el siguiente error:

Se requiere una referencia a un objeto para el campo, método o propiedad no estática 'Project.Form1.txtLog'

¿Cómo puedo acceder a los métodos y controles que están en Form1.cs de una de mis clases?

20voto

JamesSugrue Puntos 8426

Estás intentando acceder a la clase en lugar de al objeto. Esta afirmación puede ser confusa para los principiantes, pero efectivamente estás intentando abrir la puerta de tu casa cogiendo la puerta de tus planos.

Si realmente quisieras acceder a los componentes del formulario directamente desde una clase (que no es el caso) utilizarías la variable que instancie tu formulario.

Dependiendo del camino que quieras tomar, será mejor que envíes el texto de un control o lo que sea a un método de tus clases, por ejemplo

public void DoSomethingWithText(string formText)
{
   // do something text in here
}

o exponiendo las propiedades de su clase de formulario y estableciendo el texto del formulario allí - por ejemplo

string SomeProperty
{
   get 
   {
      return textBox1.Text;
   }
   set
   {
      textBox1.Text = value;
   }
}

12voto

Timothy Carter Puntos 7079

Otra solución sería pasar el cuadro de texto (o el control que quieras modificar) al método que lo manipulará como parámetro.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        TestClass test = new TestClass();
        test.ModifyText(textBox1);
    }
}

public class TestClass
{
    public void ModifyText(TextBox textBox)
    {
        textBox.Text = "New text";
    }
}

4voto

Steven A. Lowe Puntos 40596
  1. hay que tener una referencia al objeto formulario para poder acceder a sus elementos
  2. los elementos deben ser declarados públicos para que otra clase pueda acceder a ellos
  3. no haga esto - su clase tiene que saber demasiado sobre cómo se implementa su formulario; no exponga los controles del formulario fuera de la clase del formulario
  4. en lugar de eso, haz propiedades públicas en tu formulario para obtener/establecer los valores que te interesan
  5. publicar más detalles de lo que quiere y por qué, parece que puede ir en una dirección que no es coherente con las buenas prácticas de encapsulación

3voto

Keith Nicholas Puntos 20875

Necesitas acceder al objeto.... no puedes simplemente pedir la clase de formulario....

por ejemplo...

hubieras hecho algo como

Form1.txtLog.Text = "blah"

en lugar de

Form1 blah = new Form1();
blah.txtLog.Text = "hello"

1voto

rp. Puntos 9997

Tienes que hacer que los miembros de la clase de formulario sean públicos o, si la clase de servicio está en el mismo ensamblaje, internos. La visibilidad de los controles de Windows puede ser controlada a través de sus propiedades Modificadores.

Tenga en cuenta que generalmente se considera una mala práctica vincular explícitamente una clase de servicio a una clase de interfaz de usuario. Más bien deberías crear buenas interfaces entre la clase de servicio y la clase de formulario. Dicho esto, para aprender o simplemente para jugar, la tierra no se saldrá de su eje si expones los miembros del formulario para las clases de servicio.

rp

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X