it-swarm.com.de

Wie kann ich von einer Klasse in C # auf Formularmethoden und Steuerelemente zugreifen?

Ich arbeite an einem C # -Programm und momentan habe ich eine Form und ein paar Klassen. Ich möchte gerne auf einige der Form-Steuerelemente (z. B. eine TextBox) aus meiner Klasse zugreifen. Wenn ich versuche, den Text in der TextBox von meiner Klasse zu ändern, erhalte ich die folgende Fehlermeldung:

Für das nicht statische Feld, die Methode oder die Eigenschaft 'Project.Form1.txtLog' ist eine Objektreferenz erforderlich. 

Wie kann ich von einer meiner Klassen aus auf Methoden und Steuerelemente in Form1.cs zugreifen?

25
user13504

Sie versuchen, auf die Klasse statt auf das Objekt zuzugreifen. Diese Aussage kann für Anfänger verwirrend sein, aber Sie versuchen effektiv, die Haustür zu öffnen, indem Sie die Tür Ihrer Hauspläne aufgreifen.

Wenn Sie tatsächlich auf die Formularkomponenten direkt von einer Klasse zugreifen wollten (was Sie nicht tun), würden Sie die Variable verwenden, die Ihr Formular instanziiert. 

Je nachdem, in welche Richtung Sie gehen möchten, sollten Sie entweder den Text eines Steuerelements oder etwas anderes an eine Methode in Ihren Klassen senden, z

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

oder Eigenschaften in Ihrer Formularklasse verfügbar machen und dort den Formulartext festlegen - z

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

Eine andere Lösung wäre, das Textfeld (oder das zu ändernde Steuerelement) an die Methode zu übergeben, die es als Parameter verarbeitet.

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. sie müssen einen Verweis auf das Formularobjekt haben, um auf seine Elemente zugreifen zu können
  2. die Elemente müssen als öffentlich deklariert werden, damit eine andere Klasse auf sie zugreifen kann
  3. tun Sie dies nicht - Ihre Klasse muss zu viel darüber wissen, wie Ihr Formular implementiert wird. Machen Sie Formularsteuerelemente nicht außerhalb der Formularklasse verfügbar
  4. nehmen Sie stattdessen öffentliche Eigenschaften in Ihrem Formular vor, um die gewünschten Werte abzurufen/festzulegen
  5. wenn Sie mehr Details zu dem, was Sie wollen und warum, sagen, dann klingt es so, als ob Sie in eine Richtung gehen könnten, die nicht mit den guten Einkapselungsverfahren übereinstimmt
9
Steven A. Lowe

Sie benötigen Zugriff auf das Objekt .... Sie können nicht einfach die Formularklasse fragen ...

z.B...

du würdest so etwas tun

Form1.txtLog.Text = "blah"

anstatt

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

Wenn das Formular zuerst gestartet wird, können Sie im Formular Load-Handler eine Kopie unserer Klasse instanziieren. Wir können Eigenschaften haben, die auf die Steuerelemente verweisen, auf die wir verweisen möchten. Übergeben Sie den Verweis auf das Formular 'this' an den Konstruktor für die Klasse.

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

In Ihrer Klasse wird der Verweis aus dem Formular an den Konstruktor übergeben und als privates Mitglied gespeichert. Diese Formularreferenz kann verwendet werden, um auf die Eigenschaften des Formulars zuzugreifen.

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

Sie müssen die Mitglieder in der Form-Klasse entweder öffentlich machen oder, falls sich die Service-Klasse in derselben Assembly befindet, intern. Die Sichtbarkeit von Windows-Steuerelementen kann über die Modifier-Eigenschaften gesteuert werden. 

Beachten Sie, dass es im Allgemeinen eine schlechte Praxis ist, eine Serviceklasse explizit an eine UI-Klasse zu binden. Sie sollten vielmehr gute Schnittstellen zwischen der Serviceklasse und der Formularklasse erstellen. Wenn Sie jedoch lernen oder einfach nur herumspielen, dreht sich die Erde nicht aus ihrer Achse, wenn Sie Formularmitglieder für Serviceklassen verfügbar machen. 

rp

1
rp.

Ich bin relativ neu in c # und brandneu in stackoverflow. Was auch immer die Frage betrifft, wie auf Steuerelemente in einem Formular von einer Klasse aus zugegriffen werden kann: Ich habe nur die ControlCollection-Klasse (Steuerelemente) des Formulars verwendet.

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

Arbeitete für mich, vielleicht hilft es in beiden Fragen.

1
Jim

NUR KÖNNEN SIE DAS FORMULAR SENDEN, UM DIESES ZU KLASSEN

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

INSIDE CLASS, WIE SIE CLASS1 ERSTELLEN

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

WICHTIG: Sie dürfen jedoch nicht vergessen, dass Sie Modifizierer-Formulareigenschaften als PUBLIC deklariert haben und auf andere Informationen zugreifen können, wenn Sie das Steuerelement im Formular der Klasse nicht sehen können

0
Toprak