web-dev-qa-db-fra.com

Comment accéder au contrôle de zone de texte Winform depuis une autre classe?

J'ai une winform appeléeForm1et une textbox appeléetextBox1

Dans leForm1je peux définir le texte en tapant:

textBox1.text = "change text";

Maintenant, j'ai créé une autre classe. Comment appelertextBox1dans cette classe? Je souhaite donc modifier le texte pourtextBox1dans cette classe.

Comment puis-je accéder auForm1à partir de cette nouvelle classe?

31
Psychocryo

Je recommanderais que vous ne le fassiez pas. Voulez-vous vraiment avoir une classe qui dépend de la façon dont l'édition de texte est implémentée dans le formulaire ou voulez-vous un mécanisme vous permettant d'obtenir et de définir le texte ?

Je suggérerais ce dernier. Donc, dans votre formulaire, créez une propriété qui englobe la propriété Text du contrôle TextBox en question:

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

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

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

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

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

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

Dans votre classe de formulaire:

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

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

... et la classe:

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

    // and so on

}
41
Fredrik Mörk

J'étais également confronté au même problème où je ne pouvais pas ajouterText à richTextBox of Form class. J'ai donc créé une méthode appelée update, dans laquelle je passais un message à partir de Class1. 

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

classe: Class1.cs

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

Vous pouvez modifier le modificateur d'accès du champ généré dans Form1.Designer.cs de private à public. Change ça

private System.Windows.Forms.TextBox textBox1;

par ça

public System.Windows.Forms.TextBox textBox1;

Vous pouvez maintenant le gérer en utilisant une référence de la forme Form1.textBox1.

Visual Studio ne l'écrase pas si vous apportez des modifications aux propriétés du contrôle, sauf si vous le supprimez et le recréez.

Vous pouvez également vous en servir à partir de l'interface utilisateur si vous n'êtes pas à l'aise avec l'édition directe du code. Recherchez la propriété Modifiers:

 Modifiers

6
Moslem Ben Dhaou

J'ai trouvé un moyen facile de le faire, je l'ai testé, cela fonctionne correctement ..__ D'abord, j'ai créé un projet Windows, sur le formulaire J'ai inséré une zone de texte et je l'ai nommé textBox1 Puis j'ai inséré un bouton nommé button1, puis ajoutez une classe nommée class1 . dans le class1, j'ai créé une zone de texte:

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 formulaire, faites ceci:

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

dans button1_Click, j'ai copié l'objet textBox1 dans txt1. txt1 a donc maintenant les propriétés de textBox1 et vous pouvez modifier le texte textBox1 dans un autre formulaire ou une autre classe.

1
Arash Mohamadzadeh

J'ai essayé les exemples ci-dessus, mais aucun 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. L'utilisation de threads nécessiterait plus de code et n'était pas nécessaire pour ma tâche.

1
Tim

Vous aurez besoin d'un accès à l'instance du formulaire pour accéder à sa collection Controls et modifier ainsi le texte Text Box's.

Vous pouvez par exemple avoir une instance de votre formulaire disponible publiquement ou mieux. Créer un nouveau constructeur pour votre deuxième formulaire et le faire recevoir l'instance de Form1 lors de l'initialisation. 

1
Shekhar_Pro

Définissez une propriété du formulaire comme, puis utilisez-la à d'autres endroits où elle serait disponible avec l'instance de formulaire.

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

J'aime cette solution.

0
santutu

J'ai utilisé cette méthode pour mettre à jour une étiquette mais vous pouvez facilement la changer en une zone 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);
    }
}

Méthodes de formulaire qui effectueront 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;
    }
}

Finalement

Il suffit de passer le formulaire à travers le constructeur:

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

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

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

Utilisez, une variable globale ou une propriété permettant d'affecter la valeur à la zone de texte, donnez la valeur de la variable dans une autre classe et affectez-la à textbox.text dans la classe de formulaire.