Comment accéder à Winform textbox control depuis une autre classe?

j'ai un winform Form1 et textboxtextBox1

Dans le Form1 je peux définir le texte en tapant:

textBox1.text = "change text";

Maintenant, j'ai créé une autre classe. Comment dois-je appeler textBox1 dans cette classe? je veux donc changer le texte pour textBox1 dans cette classe.

Comment puis-je accéder au Form1 de cette nouvelle classe?

31
demandé sur Michel Ayres 2011-04-13 13:18:25

15 réponses

je vous recommande de ne pas. Voulez-vous vraiment avoir une classe qui dépend de la manière dont l'édition de texte est mis en œuvre dans le formulaire, ou voulez-vous un mécanisme vous permettant d'obtenir et de définir le texte?

je suggère le dernier. Ainsi, dans votre forme, créez une propriété qui enveloppe le Text propriété de l' TextBox contrôle en question:

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

ensuite, créer un mécanisme par lequel votre classe peut obtenir une référence au formulaire (par le constructeur par exemple). Alors cette classe peut utiliser la propriété pour accéder et modifier le texte:

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

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

encore mieux la solution serait de définir les interactions possibles dans une interface, et laisser cette interface être le contrat entre votre forme et l'autre classe. De cette façon, la classe est complètement découplée de la forme, et peut utiliser n'importe quelle implémentation de l'interface (ce qui ouvre la porte pour des tests beaucoup plus faciles):

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

Dans votre classe de la forme:

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

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

...et de la classe:

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

    // and so on

}
40
répondu Fredrik Mörk 2011-10-13 16:07:21

j'étais également confronté au même problème où je n'étais pas capable d'annextext à richTextBox de classe de forme. J'ai donc créé une méthode appelée update, où j'avais l'habitude de transmettre un message de la classe 1.

classe: 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();            
        }
    }
public class Class1
    {        
        public Class1()
        {
            Form1._Form1.update("change text");
        }        
    }
12
répondu Praveen 2013-04-06 07:03:58

Vous pouvez changer le modificateur d'accès pour le champ généré par Form1.Designer.csprivatepublic. Modifier ce

private System.Windows.Forms.TextBox textBox1;

par

public System.Windows.Forms.TextBox textBox1;

vous pouvez maintenant le gérer en utilisant une référence du formulaire Form1.textBox1.

Visual Studio n'écrira pas ceci si vous apportez des modifications aux propriétés de contrôle, à moins que vous ne le supprimiez et ne le recréiez.

vous pouvez également la modifier à partir de L'interface utilisateur si vous n'êtes pas à l'aise avec l'édition du code directement. Regarder pour la propriété modificateurs:

Modifiers

6
répondu Moslem Ben Dhaou 2016-06-07 11:00:48

vous aurez besoin d'avoir un certain accès à L'Instance du formulaire pour accéder à son Controls la collecte et donc la modification de la Text Box's Texte.

une des façons pourrait être que vous puissiez avoir une Instance de votre formulaire disponible en tant que public ou mieux Créer un nouveau constructeur pour votre deuxième forme et lui faire recevoir l'instance de Form1 pendant l'initialisation.

1
répondu Shekhar_Pro 2011-04-13 09:22:08

définir une propriété de la forme comme, puis l'utiliser dans d'autres endroits où elle serait disponible avec l'instance de forme

public string SetText
{
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}
1
répondu V4Vendetta 2011-04-13 09:22:49

j'ai Trouvé un moyen facile de le faire,je l'ai testé,il fonctionne Correctement. D'abord j'ai créé un projet Windows,sur le formulaire J'ai inséré une boîte de texte et je l'ai appelé textBox1 ensuite, j'ai inséré un bouton nommé button1,puis ajouter une classe nommée class1. dans la class1 j'ai créé une TextBox:

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

maintenant dans votre forme faites ceci:

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

dans le button1_Click j'ai Coppé le textBox1 objet dans txt1,donc maintenant txt1 a les propriétés de textBox1 et u peut changer le texte textBox1 dans un autre formulaire ou de la classe.

1
répondu Arash Mohamadzadeh 2013-02-25 15:58:42

j'ai essayé les exemples ci-dessus, mais aucune n'a fonctionné comme décrit. Cependant, j'ai une solution qui est combinée à partir de certains exemples:

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

cela fonctionne tant que vous n'utilisez pas de threads. Utiliser des threads nécessiterait plus de code et n'était pas nécessaire pour ma tâche.

1
répondu Tim 2016-06-21 18:28:43

si votre autre classe hérite du Form1 et si votre textBox1 est déclaré public, alors vous pouvez accéder à cette zone de texte de votre autre classe en appelant simplement:

otherClassInstance.textBox1.Text = "hello world";
0
répondu tzup 2011-04-13 09:22:30

Use, une variable globale ou une propriété pour assigner la valeur à la textbox, donner la valeur de la variable dans une autre classe et l'assigner à la textbox.texte en classe de formulaire.

0
répondu Sai Kalyan Kumar Akshinthala 2011-04-13 09:25:51
Form1 form = new Form1(); 
form.textBox1.Text = "test";
0
répondu PsychoCoder 2016-03-08 22:03:45

j'ai utilisé cette méthode pour mettre à jour une étiquette mais vous pouvez facilement la changer en une boîte de texte:

Classe:

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

Formulaire de méthodes qui permettront de faire la mise à jour:

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

Enfin

Simplement transmettre le formulaire par le constructeur:

Class1 c = new Class1(this);
0
répondu C. Carter 2017-01-18 22:32:21
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");
    }
}

j'aime cette solution.

0
répondu santutu 2017-12-10 03:24:33
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
0
répondu Chris Bond 2018-09-25 16:18:24

Qu'en est-il

Form1.textBox1.texte = "modifier le texte";

note: 1. vous devez "inclure" le Formulaire1 dans votre deuxième fichier source par à l'aide de Form1;

  1. textBox1 doit être public
-1
répondu ZeaGate 2011-04-13 09:22:37

C'est comment j'ai résolu ce problème après un combat.

j'ai globale de la classe que je peux utiliser toutes sur le projet

 public class GlobalVariables
    {
        public static Form MainFormO;
    }

j'ai ajouté ceci dans le Formulaire Principal (par Défaut:Form1)

 public MainFrm()
        {
            InitializeComponent();
            GlobalVariables.MainFormO = this;
        }

Et j'écris ce code dans la classe je veux accéder à l'élément dans MainForm. Vous pouvez simplement changer Listbox en textbox ou ce que vous voulez.

 GlobalVariables.MainFormO.Invoke((MethodInvoker)delegate
                {
                    ListBox listboxObject= Application.OpenForms["MainFrm"].Controls["listboxid"] as ListBox;
                    Debug.WriteLine(listboxObject.Items.Add("New Line"));
                });
-1
répondu İpek 2016-05-27 12:28:20