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”
- Utilizzando una matrice per ruotare i rettangoli individualmente
- Come rilevare che il codice C # Windows Form viene eseguito in Visual Studio?
- Come trascino i file in un'applicazione?
- System.Windows.Forms.Timer viene eseguito su un thread diverso rispetto all'interfaccia utente?
- Utilizza i cookie da CookieContainer in WebBrowser
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"; } }
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