Comment accéder à Winform textbox control depuis une autre classe?
j'ai un winform
Form1 et textbox
textBox1
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?
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
}
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");
}
}
Vous pouvez changer le modificateur d'accès pour le champ généré par Form1.Designer.cs
private
public
. 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:
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.
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; }
}
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.
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.
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";
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.
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);
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.
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
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;
- textBox1 doit être public
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"));
});