Come accedere ai metodi di form e ai controlli da una class in C #?

Sto lavorando ad un programma C #, e in questo momento ho una Form e un paio di classi. Mi piacerebbe essere in grado di accedere ad alcuni dei controlli Form (come un TextBox ) dalla mia class. Quando provo a cambiare il testo nel TextBox dalla mia class ottengo il seguente errore:

È richiesto un riferimento a un object per il campo, il metodo o la proprietà non statici “Project.Form1.txtLog”

Come posso accedere ai metodi e ai controlli presenti in Form1.cs da una delle mie classi?

Stai tentando di accedere alla class anziché all’object. Questa affermazione può essere fonte di confusione per i principianti, ma stai effettivamente cercando di aprire la porta di casa raccogliendo la porta sui tuoi piani di casa.

Se in realtà volessi accedere ai componenti del modulo direttamente da una class (che non lo fai), utilizzerai la variabile che crea un’istanza del modulo.

A seconda del modo in cui vuoi andare, sarebbe meglio sia mandare il testo di un controllo o qualsiasi altra cosa ad un metodo nelle tue classi, ad es

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

o esponendo le proprietà sulla class del modulo e impostando il testo del modulo lì – es

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

Un’altra soluzione sarebbe quella di passare la casella di testo (o controllo che si desidera modificare) nel metodo che lo manipolerà come parametro.

 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. devi avere un riferimento all’object modulo per poter accedere ai suoi elementi
  2. gli elementi devono essere dichiarati pubblici in modo che un’altra class possa accedervi
  3. non farlo – la tua class deve sapere troppo su come viene implementato il tuo modulo; non esporre i controlli del modulo al di fuori della class del modulo
  4. invece, crea proprietà pubbliche sul tuo modulo per ottenere / impostare i valori che ti interessano
  5. Pubblica più dettagli di ciò che vuoi e perché, sembra che tu stia procedendo in una direzione che non è coerente con le buone pratiche di incapsulamento

Hai bisogno di accedere all’object …. non puoi semplicemente chiedere la class del modulo ….

per esempio…

avresti fatto qualcosa del genere

 Form1.txtLog.Text = "blah" 

invece di

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

Se il modulo si avvia per primo, nel modulo Load handler possiamo istanziare una copia della nostra class. Possiamo avere proprietà che fanno riferimento a qualsiasi controllo vogliamo fare riferimento. Passa il riferimento al modulo ‘this’ al costruttore per la class.

 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); } } 

Nella class, il riferimento dal modulo viene passato al costruttore e memorizzato come membro privato. Questo riferimento al modulo può essere utilizzato per accedere alle proprietà del modulo.

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

È necessario rendere i membri nella class for form pubblici o, se la class di servizio è nello stesso assembly, interni. La visibilità dei controlli di Windows può essere controllata tramite le proprietà dei loro modificatori.

Si noti che in genere è considerato una ctriggers pratica bind esplicitamente una class di servizio a una class dell’interfaccia utente. Piuttosto dovresti creare buone interfacce tra la class del servizio e la class del form. Detto questo, per l’apprendimento o semplicemente in giro, la terra non si sposterà sul suo asse se esponi i membri del modulo per le classi di servizio.

rp

Sono relativamente nuovo a C # e nuovo di zecca per StackOverflow. Ad ogni modo, riguardo alla domanda su come accedere ai controlli di un modulo da una class: ho appena usato la class ControlCollection (Controls) del modulo.

  //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); 

Ha funzionato per me, forse sarà di aiuto in entrambe le domande.

SOLO PUOI INVIARE FORM IN CLASSE COME QUESTO

 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 LA CLASSE COME CREATE CLASSE1

 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: ma non devi dimenticare che hai dichiarato le proprietà del form modificatore come PUBLIC e puoi accedere ad altri saggi non puoi vedere il controllo in forma dalla class