Je travaille sur un programme C # et, pour le moment, j’ai une Form
et quelques cours. J'aimerais pouvoir accéder à certains des contrôles Form
(tels que TextBox
) de ma classe. Lorsque j'essaie de modifier le texte de la TextBox
de ma classe, l'erreur suivante apparaît:
Une référence d'objet est requise pour le champ, la méthode ou la propriété non statique 'Project.Form1.txtLog'.
Comment puis-je accéder aux méthodes et contrôles qui sont dans Form1.cs
à partir de l'une de mes classes?
Vous essayez d'accéder à la classe par opposition à l'objet. Cette déclaration peut être déroutante pour les débutants, mais vous essayez en fait d'ouvrir la porte de votre maison en décrochant celle-ci sur vos plans de maison.
Si vous voulez réellement accéder aux composants de formulaire directement à partir d'une classe (ce que vous n'avez pas), vous utiliseriez la variable qui instancie votre formulaire.
En fonction du chemin que vous souhaitez utiliser, vous feriez mieux d'envoyer le texte d'un contrôle ou quoi que ce soit à une méthode de vos classes, par exemple
public void DoSomethingWithText(string formText)
{
// do something text in here
}
ou exposer des propriétés sur votre classe de formulaire et y définir le texte - par exemple
string SomeProperty
{
get
{
return textBox1.Text;
}
set
{
textBox1.Text = value;
}
}
Une autre solution serait de passer la zone de texte (ou le contrôle que vous souhaitez modifier) à la méthode qui le manipulera en tant que paramètre.
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";
}
}
Vous devez avoir accès à l'objet .... vous ne pouvez pas simplement demander à la classe de formulaire ....
par exemple...
vous auriez fait quelque chose comme
Form1.txtLog.Text = "blah"
au lieu de
Form1 blah = new Form1();
blah.txtLog.Text = "hello"
Si le formulaire commence en premier, dans le formulaire Load Handler, nous pouvons instancier une copie de notre classe. Nous pouvons avoir des propriétés qui référencent les contrôles que nous voulons référencer. Passez la référence à la forme 'this' au constructeur de la classe.
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);
}
}
Dans votre classe, la référence du formulaire est passée au constructeur et stockée en tant que membre privé. Cette référence de formulaire peut être utilisée pour accéder aux propriétés du formulaire.
class Utilities
{
private Form1 _mainForm;
public Utilities(Form1 mainForm)
{
_mainForm = mainForm;
_mainForm.Lv.Items.Clear();
}
}
Vous devez rendre les membres de la classe de formulaire publics ou, si la classe de service se trouve dans la même assemblée, internes. La visibilité des contrôles Windows peut être contrôlée via les propriétés de leurs modificateurs.
Notez qu'il est généralement considéré comme une mauvaise pratique d'associer explicitement une classe de service à une classe d'interface utilisateur. Vous devez plutôt créer de bonnes interfaces entre la classe de service et la classe de formulaire. Cela dit, que ce soit pour apprendre ou pour jouer, la Terre ne se détournera pas de son axe si vous exposez des membres de formulaires pour des classes de services.
rp
Je suis relativement nouveau sur c # et tout nouveau sur stackoverflow. Quoi qu'il en soit, en ce qui concerne la question de l'accès aux contrôles d'un formulaire à partir d'une classe: je viens d'utiliser la classe ControlCollection (Controls) du formulaire.
//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);
Travaillé pour moi, peut-être que ce sera utile pour les deux questions.
JUSTE VOUS POUVEZ ENVOYER LE FORMULAIRE À LA CLASSE COMME CECI
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
DANS LA CLASSE AU COURS DE LA CRÉATION DE LA 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
}
}
IMPORTANT: Mais vous ne devez pas oublier que vous avez déclaré les propriétés du formulaire de modificateur en tant que PUBLIC et que vous pouvez accéder autrement, vous ne pouvez pas voir le contrôle dans le formulaire de la classe