2008-10-20 93 views
24

Estoy trabajando en un programa C#, y ahora tengo uno Form y un par de clases. Me gustaría poder acceder a algunos de los controles Form (como un TextBox) de mi clase. Cuando trato de cambiar el texto en el TextBox de mi clase me sale el siguiente error:¿Cómo acceder a los métodos y controles de formulario de una clase en C#?

An object reference is required for the non-static field, method, or property 'Project.Form1.txtLog'

Cómo puedo acceder a los métodos y los controles que se encuentran en Form1.cs de una de mis clases?

Respuesta

28

usted está tratando de acceder a la clase en oposición al objeto. Esa declaración puede ser confusa para los principiantes, pero efectivamente estás tratando de abrir la puerta de tu casa al levantar la puerta de los planes de tu casa.

Si realmente desea acceder a los componentes del formulario directamente desde una clase (que no), utilizaría la variable que crea su formulario.

Dependiendo de en qué dirección quiere ir que sería mejor de cualquiera de enviar el texto de un control o lo que sea a un método en sus clases, por ejemplo,

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

o exponer propiedades en su clase de forma y configuración el texto forma allí - por ejemplo

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

En "textBox1.Text = value" ¿de dónde viene el valor? – user128807

+0

¿cómo puedo actualizar los datos de la cuadrícula con este método? –

+0

"efectivamente estás tratando de abrir la puerta de tu casa al levantar la puerta de los planes de tu casa". No tiene precio. –

9
  1. usted tiene que tener una referencia al objeto de formulario con el fin de acceder a sus elementos
  2. los elementos tienen que ser declarada pública con el fin de otra clase para acceder a ellos
  3. no hacen esto - su la clase tiene que saber demasiado sobre cómo se implementa su formulario; no exponer los controles de formulario fuera del formulario clase
  4. en su lugar, haga públicos los valores que le interesen
  5. publique más detalles de lo que desea de ir en una dirección que no es consistente con las buenas prácticas de encapsulación
3

es necesario el acceso al objeto .... no se puede simplemente pedir a la clase de formulario ....

por ejemplo ...

Habría hecho algo como

Form1.txtLog.Text = "blah" 

en lugar de

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

que necesita para hacer los miembros de la clase a la forma ya sea pública o, si la clase de servicio se encuentra en el mismo conjunto, interno. La visibilidad de los controles de Windows se puede controlar a través de sus propiedades de modificadores.

Tenga en cuenta que generalmente se considera una mala práctica vincular explícitamente una clase de servicio a una clase de UI. En su lugar, debe 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 desviará de su eje si expone a los miembros del formulario para las clases de servicio.

rp

14

Otra solución sería pasar el cuadro de texto (o control que desea modificar) en el método que manipularla como un 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"; 
    } 
} 
+1

Pero pasaste el control dentro de Formulario a clase. Es exactamente como dijiste, pero ¿cómo sería que sea inverso? – uzay95

2

Si el formulario se inicia primero, en la forma Load handler podemos instanciar una copia de nuestra clase. Podemos tener propiedades que hacen referencia a los controles a los que queremos hacer referencia. Pase la referencia al formulario 'this' al constructor de la clase.

public partial class Form1 : Form 
{ 
    public ListView Lv 
    { 
     get { return lvProcesses; } 
    } 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Utilities ut = new Utilities(this); 
    } 
} 

En su clase, la referencia del formulario se pasa al constructor y se almacena como un miembro privado. Esta referencia de formulario se puede usar para acceder a las propiedades del formulario.

class Utilities 
{ 
    private Form1 _mainForm; 
    public Utilities(Form1 mainForm) 
    { 
     _mainForm = mainForm; 
     _mainForm.Lv.Items.Clear(); 
    } 
} 
1

Soy relativamente nuevo en C# y nuevo en stackoverflow. De todos modos, con respecto a la pregunta sobre cómo acceder a los controles en un formulario de una clase: Acabo de utilizar la clase ControlCollection (Controles) del formulario.

 //Add a new form called frmEditData to project. 
     //Draw a textbox on it named txtTest; set the text to 
     //something in design as a test. 
     Form frmED = new frmEditData(); 
     MessageBox.Show(frmED.Controls["txtTest"].Text); 

Trabajado para mí, quizás sea de ayuda en ambas preguntas.

0

sólo le pueden enviar FORMULARIO PARA clase como esta

Class1 excell = new Class1(); //you must declare this in form as you want to control 

excel.get_data_from_excel(this); // And create instance for class and sen this form to another class 

DENTRO DE CLASE A medida que crea CLASS1

class Class1 
{ 
    public void get_data_from_excel (Form1 form) //you getting the form here and you can control as you want 
    { 
     form.ComboBox1.text = "try it"; //you can chance Form1 UI elements inside the class now 
    } 
} 

IMPORTANTE: Pero no hay que forgat tiene declarar las propiedades del formulario modificador como PUBLIC y puede acceder de otra manera no puede ver el control en el formulario de la clase

Cuestiones relacionadas