it-swarm.com.de

Wie kann von einer anderen Klasse auf das Winform-Textfeldsteuerelement zugegriffen werden

Ich habe eine winform namens Form1 und eine textbox namens textBox1

Im Form1 kann ich den Text setzen, indem ich Folgendes eingebe:

textBox1.text = "change text";

Jetzt habe ich eine andere Klasse erstellt. Wie rufe ich textBox1 in dieser Klasse auf? Ich möchte den Text für textBox1 in dieser Klasse ändern.

Wie kann ich von dieser neuen Klasse auf das Form1 zugreifen?

31
Psychocryo

Ich würde empfehlen, dass Sie es nicht tun. Möchten Sie wirklich eine Klasse haben, die davon abhängig ist, wie die Textbearbeitung im Formular implementiert wird, oder möchten Sie einen Mechanismus, mit dem Sie den Text abrufen und festlegen können?

Ich würde das letztere vorschlagen. Erstellen Sie also in Ihrem Formular eine Eigenschaft, die die Text -Eigenschaft des betreffenden TextBox-Steuerelements umgibt:

public string FirstName
{
    get { return firstNameTextBox.Text; }
    set { firstNameTextBox.Text = value; }
}

Als Nächstes erstellen Sie einen Mechanismus, über den Sie Klassen auf das Formular verweisen können (beispielsweise durch den Konstruktor). Dann kann diese Klasse die Eigenschaft verwenden, um auf den Text zuzugreifen und ihn zu ändern:

class SomeClass
{
    private readonly YourFormClass form;
    public SomeClass(YourFormClass form)
    {
        this.form = form;
    }

    private void SomeMethodDoingStuffWithText()
    {
        string firstName = form.FirstName;
        form.FirstName = "some name";
    }
}

Eine noch bessere Lösung wäre, die möglichen Interaktionen in einer Schnittstelle zu definieren und diese Schnittstelle der Vertrag zwischen Ihrem Formular und der anderen Klasse sein zu lassen. Auf diese Weise ist die Klasse vollständig vom Formular entkoppelt und kann mit anyting die Schnittstelle implementieren (was die Tür für viel einfachere Tests öffnet):

interface IYourForm
{
    string FirstName { get; set; }
}

In Ihrer Formklasse:

class YourFormClass : Form, IYourForm
{
    // lots of other code here

    public string FirstName
    {
        get { return firstNameTextBox.Text; }
        set { firstNameTextBox.Text = value; }
    }
}

... und die Klasse:

class SomeClass
{
    private readonly IYourForm form;
    public SomeClass(IYourForm form)
    {
        this.form = form;
    }

    // and so on

}
41
Fredrik Mörk

Ich hatte auch das gleiche Problem, dass ich nicht an RichTextBox der Form-Klasse anhängen konnte. Also habe ich eine Methode namens update erstellt, bei der ich eine Nachricht von Class1 übergeben habe. 

klasse: Form1.cs

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            _Form1 = this;
        }
        public static Form1 _Form1;

        public void update(string message)
        {
            textBox1.Text = message;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Class1 sample = new Class1();            
        }
    }

klasse: Class1.cs

public class Class1
    {        
        public Class1()
        {
            Form1._Form1.update("change text");
        }        
    }
12
Praveen

Sie können den Zugriffsmodifizierer für das generierte Feld in Form1.Designer.cs von private in public ändern. Ändere das

private System.Windows.Forms.TextBox textBox1;

dadurch

public System.Windows.Forms.TextBox textBox1;

Sie können es jetzt mit einer Referenz des Formulars Form1.textBox1 behandeln.

Visual Studio überschreibt dies nicht, wenn Sie Änderungen an den Steuerelementeigenschaften vornehmen, es sei denn, Sie löschen es und erstellen es neu.

Sie können es auch von der Benutzeroberfläche aus ausführen, wenn Sie nicht mit der direkten Bearbeitung von Code zufrieden sind. Suchen Sie nach der Modifiers-Eigenschaft:

 Modifiers

6

Ich fand einen einfachen Weg, dies zu tun, ich habe es getestet, es funktioniert einwandfrei . Zuerst habe ich ein Windows-Projekt erstellt, auf dem Formular habe ich eine TextBox eingefügt und ich habe es textBox1 Dann habe ich eine Schaltfläche namens eingefügt button1, dann füge eine Klasse mit dem Namen class1 ..__ hinzu. In class1 habe ich ein TextBox erstellt:

class class1
    {
     public static TextBox txt1=new TextBox();  //a global textbox to interfece with      form1
    public static void Hello()
      {
       txt1.Text="Hello";
      }
    }

Jetzt in deiner Form mache das:

public partial class Form1 : Form
    {
     public Form1()
     {
      InitializeComponent();  
     }
     private void button1_Click(object sender, EventArgs e)
      {
       class1.txt1=textBox1;
       class1.Hello();
       }
    }

im button1_Click habe ich das Objekt textBox1 in txt1 kopiert, so dass jetzt txt1 die Eigenschaften .__ von textBox1 hat und u textBox1-Text in einem anderen Formular oder einer anderen Klasse ändern kann.

1

Ich habe die obigen Beispiele ausprobiert, aber keines funktionierte wie beschrieben. Ich habe jedoch eine Lösung, die aus einigen Beispielen kombiniert wird:

public static Form1 gui;
public Form1()
{
    InitializeComponent();
    gui = this;
    comms = new Comms();

}
public Comms()
{
    Form1.gui.tsStatus.Text = "test";
    Form1.gui.addLogLine("Hello from Comms class");
    Form1.gui.bn_connect.Text = "Comms";
}

Dies funktioniert, solange Sie keine Threads verwenden. Die Verwendung von Threads würde mehr Code erfordern und wurde für meine Aufgabe nicht benötigt.

1
Tim

Sie benötigen etwas Zugriff auf die Instanz des Formulars, um auf die Controls-Auflistung zuzugreifen und dadurch den Text Box's-Text zu ändern.

Eine der Möglichkeiten könnte sein, dass Sie die Instanz Ihres Formulars als öffentlich verfügbar machen oder besser einen neuen Konstruktor für Ihr zweites Formular erstellen lassen und während der Initialisierung die Instanz von Form1 erhalten. 

1
Shekhar_Pro

Definieren Sie eine Eigenschaft des Formulars wie, und verwenden Sie diese an anderen Stellen, an denen sie mit der Formularinstanz verfügbar wäre

public string SetText
{
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}
1
V4Vendetta
public partial class Form1 : Form
{

    public static Form1 gui;
    public Form1()
    {
        InitializeComponent();
        gui = this;

    }
    public void WriteLog(string log)
    {
        this.Invoke(new Action(() => { txtbx_test1.Text += log; }));

    }
}
public class SomeAnotherClass
{
    public void Test()
    {
        Form1.gui.WriteLog("1234");
    }
}

Ich mag diese Lösung.

0
santutu

Ich habe diese Methode zum Aktualisieren eines Labels verwendet, aber Sie können es leicht in ein Textfeld ändern:

Klasse:

public Class1
{
    public Form_Class formToOutput;

    public Class1(Form_Class f){
        formToOutput = f;
    }

    // Then call this method and pass whatever string
    private void Write(string s)
    {
        formToOutput.MethodToBeCalledByClass(s);
    }
}

Formularmethoden, die die Aktualisierung durchführen:

public Form_Class{

    // Methods that will do the updating
    public void MethodToBeCalledByClass(string messageToSend)
    {
       if (InvokeRequired) { 
           Invoke(new OutputDelegate(UpdateText),messageToSend); 
       }
    }

    public delegate void OutputDelegate(string messageToSend);
    public void UpdateText(string messageToSend)
    {
       label1.Text = messageToSend;
    }
}

Endlich

Übergeben Sie einfach das Formular durch den Konstruktor:

Class1 c = new Class1(this);
0
C. Carter
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
0
Chris Bond
Form1 form = new Form1(); 
form.textBox1.Text = "test";
0
PsychoCoder

Wenn Ihre andere Klasse Form1 erbt und Ihre TextBox1 als öffentlich deklariert ist, können Sie auf dieses Textfeld von Ihrer anderen Klasse aus zugreifen, indem Sie einfach Folgendes aufrufen:

otherClassInstance.textBox1.Text = "hello world";
0
tzup

Verwenden Sie eine globale Variable oder Eigenschaft, um den Wert dem Textfeld zuzuweisen, geben Sie den Wert für die Variable in einer anderen Klasse an und weisen Sie ihn dem Textbox.text in der Formularklasse zu.