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

je travaille sur un programme C#, et maintenant j'ai un Form et quelques cours. Je voudrais être en mesure d'accéder à certains Form contrôles (tels que a TextBox) de ma classe. Quand j'essaie de changer le texte dans le TextBox dans ma classe, j'obtiens l'erreur suivante:

une référence à un objet est requise pour le projet d'un champ, d'une méthode ou d'une propriété non statique.Form1.txtLog'

Comment puis-je accéder aux méthodes et contrôles Form1.cs dans une de mes classes?

24
demandé sur Gustavo Mori 2008-10-20 06:42:47
la source

8 ответов

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 effectivement d'ouvrir votre porte de maison en ramassant la porte sur vos plans de maison.

si vous voulez réellement accéder aux composants du formulaire directement à partir d'une classe (ce qui n'est pas le cas), vous utiliserez la variable qui instancie votre formulaire.

selon le chemin que vous voulez prendre, vous feriez mieux d'envoyer le texte d'un contrôle ou peu importe à une méthode dans vos classes par exemple

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

ou en exposant des propriétés sur votre classe de formulaire et en définissant le texte du formulaire là-bas-par exemple

string SomeProperty
{
   get 
   {
      return textBox1.Text;
   }
   set
   {
      textBox1.Text = value;
   }
}
28
répondu JamesSugrue 2008-10-20 06:50:41
la source

une autre solution serait de passer la textbox (ou le contrôle que vous voulez modifier) dans la méthode qui va la manipuler comme un 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
répondu Timothy Carter 2008-10-20 07:12:40
la source
  1. vous devez avoir une référence à l'objet form pour accéder à ses éléments
  2. les éléments doivent être déclarées public pour une autre classe pour y accéder
  3. ne pas le faire - votre classe a à trop en savoir sur la façon dont votre formulaire est mis en œuvre; ne pas exposer les contrôles de formulaire à l'extérieur de la classe de la forme
  4. à la place, faites des propriétés publiques sur votre formulaire pour obtenir / définir les valeurs qui vous intéressent
  5. afficher plus de détails de ce vous voulez et pourquoi, on dirait que vous partez dans une direction qui n'est pas compatible avec les bonnes pratiques d'encapsulation
9
répondu Steven A. Lowe 2008-10-20 06:45:55
la source

Vous avez besoin d'accéder à l'objet.... vous ne pouvez pas simplement demander à la classe de forme....

par exemple...

vous auriez fait quelque chose comme

Form1.txtLog.Text = "blah"

au lieu de

Form1 blah = new Form1();
blah.txtLog.Text = "hello"
3
répondu Keith Nicholas 2008-10-20 06:47:28
la source

si le formulaire démarre en premier, dans le Gestionnaire de charge de formulaire nous pouvons instancier une copie de notre classe. Nous pouvons avoir des propriétés qui référence les contrôles que nous voulons de référence. Passer la référence au formulaire 'ceci' au constructeur pour 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 transmise au constructeur et stockée en tant que membre privé. Cette référence au 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
répondu Ojhnny777 2010-02-13 07:42:32
la source

vous devez rendre les membres de la classe for the form soit publics soit, si la classe service est dans la même assemblée, internes. La visibilité des commandes Windows peut être contrôlée par leurs propriétés modificatrices.

notez qu'il est généralement considéré comme une mauvaise pratique de lier explicitement une classe de service à une classe D'assurance-chômage. Vous devez plutôt créer de bonnes interfaces entre la classe service et la classe form. Cela dit, pour apprendre ou tout simplement déconner, la terre il ne se détachera pas de son axe si vous exposez des membres de form pour des classes de service.

rp

1
répondu rp. 2008-10-20 06:50:49
la source

je suis relativement nouveau à c# et tout nouveau à stackoverflow. Quoi qu'il en soit, en ce qui concerne la question sur la façon d'accéder aux contrôles sur un formulaire 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);

a travaillé pour moi, peut-être qu'il sera d'une aide dans les deux questions.

1
répondu Jim 2012-01-05 23:51:01
la source

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

À L'INTÉRIEUR DE LA CLASSE COMME VOUS CRÉEZ LA CLASSE 1

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 des propriétés de formulaire de déclaration modificateur en tant que PUBLIC et vous pouvez accéder autrement vous ne pouvez pas voir le contrôle en forme de la classe

0
répondu Toprak 2014-01-02 17:19:46
la source

Autres questions sur