¿Cómo acceder al control de cuadro de texto de Winform desde otra clase?

Tengo un winform llamado Form1 y un textbox llamado textBox1

En Form1 puedo establecer el texto escribiendo:

 textBox1.text = "change text"; 

Ahora he creado otra clase. ¿Cómo llamo a textBox1 en esta clase? así que quiero cambiar el texto para textBox1 en esta clase.

¿Cómo puedo acceder al Formulario 1 de esta nueva clase?

Yo recomendaría que no lo haga. ¿Realmente desea tener una clase que dependa de cómo se implementa la edición de texto en el formulario, o desea un mecanismo que le permita obtener y configurar el texto ?

Yo sugeriría lo último. Entonces, en su forma, cree una propiedad que ajuste la propiedad Text del control TextBox en cuestión:

 public string FirstName { get { return firstNameTextBox.Text; } set { firstNameTextBox.Text = value; } } 

A continuación, cree algún mecanismo a través del cual su clase pueda obtener una referencia al formulario (a través del contructor, por ejemplo). Entonces esa clase puede usar la propiedad para acceder y modificar el texto:

 class SomeClass { private readonly YourFormClass form; public SomeClass(YourFormClass form) { this.form = form; } private void SomeMethodDoingStuffWithText() { string firstName = form.FirstName; form.FirstName = "some name"; } } 

Una solución aún mejor sería definir las posibles interacciones en una interfaz, y dejar que esa interfaz sea el contrato entre su formulario y la otra clase. De esta manera, la clase está completamente desacoplada del formulario, y puede usar cualquier implementación de la interfaz (lo que abre la puerta a pruebas mucho más sencillas):

 interface IYourForm { string FirstName { get; set; } } 

En tu clase de forma:

 class YourFormClass : Form, IYourForm { // lots of other code here public string FirstName { get { return firstNameTextBox.Text; } set { firstNameTextBox.Text = value; } } } 

… y la clase:

 class SomeClass { private readonly IYourForm form; public SomeClass(IYourForm form) { this.form = form; } // and so on } 

También me enfrentaba al mismo problema en el que no podía agregar texto a la casilla richTextBox de la clase Form. Así que creé un método llamado update , donde solía pasar un mensaje de Class1.

clase: Form1.cs

 public partial class Form1 : Form { public Form1() { InitializeComponent(); _Form1 = this; } public static Form1 _Form1; public void update(string message) { textBox1.Text = message; } private void Form1_Load(object sender, EventArgs e) { Class1 sample = new Class1(); } } 

clase: Class1.cs

 public class Class1 { public Class1() { Form1._Form1.update("change text"); } } 

Puede cambiar el modificador de acceso para el campo generado en Form1.Designer.cs de private a public . Cambia esto

 private System.Windows.Forms.TextBox textBox1; 

por esto

 public System.Windows.Forms.TextBox textBox1; 

Ahora puede manejarlo utilizando una referencia del formulario Form1.textBox1 .

Visual Studio no sobrescribirá esto si realiza cambios en las propiedades de control, a menos que lo elimine y vuelva a crearlo.

También puede cambiarlo desde la IU si no está cómodo con el código de edición directamente. Busque la propiedad Modificadores:

Modificadores

Necesitará tener acceso a la instancia del formulario para acceder a su colección de Controls y, por lo tanto, cambiar el Text Box's texto.

Una de las formas podría ser que usted puede tener una instancia de su formulario disponible como pública o más. Crear un nuevo constructor para su segundo formulario y hacer que reciba la instancia del formulario1 durante la inicialización.

Defina una propiedad del formulario como, luego use esto en otros lugares, estaría disponible con la instancia del formulario

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

Encontré una manera fácil de hacer esto, lo probé, funciona correctamente. Primero creé un Proyecto de Windows, en el formulario inserté un TextBox y lo llamé textBox1 luego inserté un botón llamado button1, luego agregué una clase llamada class1. en la clase 1 creé un TextBox:

 class class1 { public static TextBox txt1=new TextBox(); //a global textbox to interfece with form1 public static void Hello() { txt1.Text="Hello"; } } 

Ahora en su forma Haga esto:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { class1.txt1=textBox1; class1.Hello(); } } 

en el button1_Click Copié el objeto textBox1 en txt1, por lo que ahora txt1 tiene las propiedades de textBox1 y puede cambiar el texto de textBox1 en otro formulario o clase.

Probé los ejemplos anteriores, pero ninguno funcionó como se describe. Sin embargo, tengo una solución que se combina con algunos de los ejemplos:

 public static Form1 gui; public Form1() { InitializeComponent(); gui = this; comms = new Comms(); } public Comms() { Form1.gui.tsStatus.Text = "test"; Form1.gui.addLogLine("Hello from Comms class"); Form1.gui.bn_connect.Text = "Comms"; } 

Esto funciona siempre y cuando no uses hilos. Usar hilos requeriría más código y no era necesario para mi tarea.

Si su otra clase hereda Form1 y si su textBox1 se declara pública, entonces puede acceder a ese cuadro de texto de su otra clase simplemente llamando a:

 otherClassInstance.textBox1.Text = "hello world"; 

Use, una variable o propiedad global para asignar el valor al cuadro de texto, proporcione el valor para la variable en otra clase y asígnelo al textbox.text en la clase de formulario.

 Form1 form = new Form1(); form.textBox1.Text = "test"; 

Utilicé este método para actualizar una etiqueta, pero podría cambiarlo fácilmente a un cuadro de texto:

Clase:

 public Class1 { public Form_Class formToOutput; public Class1(Form_Class f){ formToOutput = f; } // Then call this method and pass whatever string private void Write(string s) { formToOutput.MethodToBeCalledByClass(s); } } 

Forme los métodos que harán la actualización:

 public Form_Class{ // Methods that will do the updating public void MethodToBeCalledByClass(string messageToSend) { if (InvokeRequired) { Invoke(new OutputDelegate(UpdateText),messageToSend); } } public delegate void OutputDelegate(string messageToSend); public void UpdateText(string messageToSend) { label1.Text = messageToSend; } } 

Finalmente

Simplemente pase el formulario a través del constructor:

 Class1 c = new Class1(this); 
 public partial class Form1 : Form { public static Form1 gui; public Form1() { InitializeComponent(); gui = this; } public void WriteLog(string log) { this.Invoke(new Action(() => { txtbx_test1.Text += log; })); } } public class SomeAnotherClass { public void Test() { Form1.gui.WriteLog("1234"); } } 

Me gusta esta solución.

Qué pasa

Form1.textBox1.text = “cambiar texto”;

nota: 1. debe “incluir” Form1 en su segundo archivo fuente de formulario utilizando Form1;

  1. textBox1 debe ser público

Así es como lo resolví después de luchar por ello.

Tengo una clase global que puedo usar en todo el proyecto

  public class GlobalVariables { public static Form MainFormO; } 

Agregué esto en el Formulario principal (Predeterminado: Form1)

  public MainFrm() { InitializeComponent(); GlobalVariables.MainFormO = this; } 

Y escribo este código en la clase que quiero acceder al elemento en MainForm. Puedes simplemente cambiar Listbox a textbox o lo que quieras.

  GlobalVariables.MainFormO.Invoke((MethodInvoker)delegate { ListBox listboxObject= Application.OpenForms["MainFrm"].Controls["listboxid"] as ListBox; Debug.WriteLine(listboxObject.Items.Add("New Line")); });