web-dev-qa-db-fra.com

Comment accéder aux méthodes de formulaire et aux contrôles à partir d'une classe en C #?

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?

25
user13504

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;
   }
}
28
JamesSugrue

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";
    }
}
14
Timothy Carter
  1. vous devez avoir une référence à l'objet formulaire pour accéder à ses éléments
  2. les éléments doivent être déclarés publics pour qu'une autre classe puisse y accéder
  3. ne faites pas cela - votre classe doit en savoir trop sur la manière dont votre formulaire est implémenté; ne pas exposer les contrôles de formulaire en dehors de la classe de formulaire
  4. placez plutôt des propriétés publiques sur votre formulaire pour obtenir/définir les valeurs qui vous intéressent
  5. postez plus de détails sur ce que vous voulez et pourquoi, on dirait que vous vous dirigez peut-être dans une direction qui ne correspond pas aux bonnes pratiques d’encapsulation
9
Steven A. Lowe

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"
3
Keith Nicholas

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();
    }
}
2
Ojhnny777

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

1
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.

1
Jim

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

0
Toprak