如何从另一个类访问Winform文本框控件?
我有一个名为Form1的winform
和一个名为textBox1的textbox
在Form1中,我可以通过键入以下内容来设置文本:
textBox1.text = "change text";
现在我创建了另一个类。 如何在此课程中调用textBox1 ? 所以我想在这个类中更改textBox1的文本。
如何从这个新类访问Form1 ?
我建议你不要。 你真的想拥有一个依赖于文本编辑在表单中实现方式的类,或者你想要一个允许你获取和设置文本的机制吗?
我会建议后者。 因此,在您的表单中,创建一个包装TextBox
控件的Text
属性的属性:
public string FirstName { get { return firstNameTextBox.Text; } set { firstNameTextBox.Text = value; } }
接下来,创建一些机制,通过该机制,类可以获取对表单的引用(例如,通过构造函数)。 然后该类可以使用该属性来访问和修改文本:
class SomeClass { private readonly YourFormClass form; public SomeClass(YourFormClass form) { this.form = form; } private void SomeMethodDoingStuffWithText() { string firstName = form.FirstName; form.FirstName = "some name"; } }
更好的解决方案是在接口中定义可能的交互,并让该接口成为表单与其他类之间的契约。 这样,类就完全与表单分离,并且可以使用任何实现接口(这为更容易测试打开了大门):
interface IYourForm { string FirstName { get; set; } }
在您的表单类中:
class YourFormClass : Form, IYourForm { // lots of other code here public string FirstName { get { return firstNameTextBox.Text; } set { firstNameTextBox.Text = value; } } }
……和class级:
class SomeClass { private readonly IYourForm form; public SomeClass(IYourForm form) { this.form = form; } // and so on }
我也遇到了同样的问题,我无法将appendText附加到Form类的richTextBox。 所以我创建了一个名为update
的方法,其中我曾经从Class1传递消息。
class: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(); } }
class:Class1.cs
public class Class1 { public Class1() { Form1._Form1.update("change text"); } }
您可以将Form1.Designer.cs
生成的字段的访问修饰符从private
更改为public
。 改变这个
private System.Windows.Forms.TextBox textBox1;
这样
public System.Windows.Forms.TextBox textBox1;
您现在可以使用Form1.textBox1
forms的引用来处理它。
如果对控件属性进行任何更改,Visual Studio将不会覆盖此属性,除非您删除它并重新创建它。
如果您不能直接编辑代码,也可以从UI中获取它。 寻找Modifiers属性:
您需要访问Form的Instance才能访问其Controls
集合,从而更改Text Box's
Text。
其中一种方法可能是您可以将您的表单的实例作为公共或更多更好地为您的第二个表单创建一个新的构造函数并让它在初始化期间接收Form1的实例。
定义表单的属性,然后在其他地方使用它,它将与表单实例一起使用
public string SetText { get { return textBox1.Text; } set { textBox1.Text = value; } }
我找到了一个简单的方法来做到这一点,我测试了它,它正常工作。 首先我创建了一个Windows项目,在我插入一个TextBox的表单上,我将其命名为textBox1然后我插入了一个名为button1的按钮,然后添加一个名为class1的类。 在class1中我创建了一个TextBox:
class class1 { public static TextBox txt1=new TextBox(); //a global textbox to interfece with form1 public static void Hello() { txt1.Text="Hello"; } }
现在在你的表格中这样做:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { class1.txt1=textBox1; class1.Hello(); } }
在button1_Click中我将对象textBox1变为txt1,所以现在txt1具有textBox1的属性,你可以在另一种forms或类中更改textBox1文本。
我尝试了上面的例子,但没有一个像描述的那样工作。 但是,我有一个解决方案,结合了一些例子:
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"; }
只要你没有使用线程,这就可以工作。 使用线程需要更多代码,而我的任务不需要。
如果你的另一个类inheritance了Form1,并且你的textBox1被声明为public,那么只需调用以下命令即可从其他类访问该文本框:
otherClassInstance.textBox1.Text = "hello world";
使用全局变量或属性将值分配给文本框,在另一个类中为变量赋值,并将其分配给表单类中的textbox.text。
Form1 form = new Form1(); form.textBox1.Text = "test";
我使用此方法更新标签,但您可以轻松将其更改为文本框:
类:
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); } }
表单方法将进行更新:
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; } }
最后
只需通过构造函数传递表单:
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"); } }
我喜欢这个解决方案。
Form frm1 = new Form1(); frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
关于什么
Form1.textBox1.text =“更改文字”;
注意:1。您必须使用Form1将Form1“包含”到第二个表单源文件中;
- textBox1应该是公共的
这就是我在为之奋斗之后如何解决这个问题。
我有全球课程,我可以在整个项目中使用
public class GlobalVariables { public static Form MainFormO; }
我在主窗体中添加了这个(默认值:Form1)
public MainFrm() { InitializeComponent(); GlobalVariables.MainFormO = this; }
我在类中编写此代码我想访问MainForm中的元素。 您可以将列表框更改为文本框或任何您想要的内容。
GlobalVariables.MainFormO.Invoke((MethodInvoker)delegate { ListBox listboxObject= Application.OpenForms["MainFrm"].Controls["listboxid"] as ListBox; Debug.WriteLine(listboxObject.Items.Add("New Line")); });