How to access Winform textbox control from another class?
我有一个叫form1的
在Form1中,我可以通过键入以下内容来设置文本:
1 | textBox1.text ="change text"; |
现在我创建了另一个类。在这个类中如何调用textbox 1?所以我想更改这个类中textbox 1的文本。
如何从这个新类访问Form1?
我建议您不要这样做。您真的想要一个依赖于文本编辑在表单中的实现方式的类,还是想要一个允许您获取和设置文本的机制?
我建议后者。因此,在您的表单中,创建一个包含所讨论的
1 2 3 4 5 | public string FirstName { get { return firstNameTextBox.Text; } set { firstNameTextBox.Text = value; } } |
接下来,创建一些机制,通过这些机制,类可以获得对表单的引用(例如,通过构造函数)。然后该类可以使用属性访问和修改文本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class SomeClass { private readonly YourFormClass form; public SomeClass(YourFormClass form) { this.form = form; } private void SomeMethodDoingStuffWithText() { string firstName = form.FirstName; form.FirstName ="some name"; } } |
一个更好的解决方案是定义一个接口中可能的交互,并让这个接口成为表单和其他类之间的契约。这样,类就与表单完全分离了,并且可以使用任何实现接口的方法(这为更简单的测试打开了大门):
1 2 3 4 | interface IYourForm { string FirstName { get; set; } } |
在窗体类中:
1 2 3 4 5 6 7 8 9 10 | class YourFormClass : Form, IYourForm { // lots of other code here public string FirstName { get { return firstNameTextBox.Text; } set { firstNameTextBox.Text = value; } } } |
…和班级:
1 2 3 4 5 6 7 8 9 10 11 | class SomeClass { private readonly IYourForm form; public SomeClass(IYourForm form) { this.form = form; } // and so on } |
我也面临同样的问题,我无法将文本追加到表单类的richtextbox。所以我创建了一个名为
类:FAL1.CS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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(); } } |
等级:Class1.cs
1 2 3 4 5 6 7 | public class Class1 { public Class1() { Form1._Form1.update("change text"); } } |
可以将
1 | private System.Windows.Forms.TextBox textBox1; |
以此
1 | public System.Windows.Forms.TextBox textBox1; |
您现在可以使用
如果对控件属性进行任何更改,Visual Studio将不会覆盖此内容,除非将其删除并重新创建。
如果您不习惯直接编辑代码,也可以从用户界面进行更改。查找Modifiers属性:
我试过上面的例子,但没有一个像描述的那样有效。但是,我有一个结合了一些示例的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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"; } |
只要不使用线程,这就可以工作。使用线程需要更多的代码,我的任务不需要这些代码。
我找到了一个简单的方法,我已经测试过了,它工作正常。首先,我创建了一个Windows项目,在表单上插入了一个文本框,并将其命名为textbox 1然后我插入了一个名为button1的按钮,然后添加了一个名为class1的类。在Class1中,我创建了一个文本框:
1 2 3 4 5 6 7 8 | class class1 { public static TextBox txt1=new TextBox(); //a global textbox to interfece with form1 public static void Hello() { txt1.Text="Hello"; } } |
现在,以您的形式执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 | public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { class1.txt1=textBox1; class1.Hello(); } } |
在按钮1中,单击我将对象textbox 1复制到txt1中,因此现在txt1具有属性对于textbox 1和u,可以在另一个窗体或类中更改textbox 1文本。
像这样定义窗体的属性,然后在窗体实例中可以使用的其他位置使用它
1 2 3 4 5 | public string SetText { get { return textBox1.Text; } set { textBox1.Text = value; } } |
您需要对表单实例进行一些访问,才能访问其
其中一种方法是,您可以将表单的实例作为公共实例使用,或者更好地为第二个表单创建一个新的构造函数,并让它在初始化期间接收表单1的实例。
1 2 | Form frm1 = new Form1(); frm1.Controls.Find("control_name",true)[0].Text ="I changed this from another form"; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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"); } } |
我喜欢这个解决方案。
我使用此方法更新标签,但您可以轻松地将其更改为文本框:
班级:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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); } } |
将执行更新的表单方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; } } |
终于
只需通过构造函数传递表单:
1 |
1 2 |
使用全局变量或属性将值赋给文本框,为另一个类中的变量赋值,并将其赋给窗体类中的textbox.text。
如果您的另一个类继承了Form1,并且您的text box 1被声明为public,那么您可以通过简单的调用从另一个类访问该文本框:
1 | otherClassInstance.textBox1.Text ="hello world"; |
怎么样
form1.textbox 1.text="更改文本";
注:1。您必须将表单1"包括"到第二个表单源文件使用Frim1;