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?
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
}
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");
}
}
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:
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.
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.
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.
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; }
}
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.
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);
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
Form1 form = new Form1();
form.textBox1.Text = "test";
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";
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.