C# 如何从另一个类访问Winform textbox控件?
我有一个C# 如何从另一个类访问Winform textbox控件?,c#,winforms,class,inheritance,controls,C#,Winforms,Class,Inheritance,Controls,我有一个winform名为Form1和一个textbox名为textBox1 在表格1中,我可以通过键入以下内容来设置文本: textBox1.text = "change text"; 现在我创建了另一个类。在这门课上我怎么称呼textBox1? 因此,我想在这个类中更改textBox1的文本 如何从这个新类访问表单1?您需要对表单的实例具有一定的访问权限,才能访问其控件的集合,从而更改文本框的文本 其中一种方法是,您可以将窗体实例作为公共实例提供,或者更好地为第二个窗体创建一个新构造函数,
winform
名为Form1和一个textbox
名为textBox1
在表格1中,我可以通过键入以下内容来设置文本:
textBox1.text = "change text";
现在我创建了另一个类。在这门课上我怎么称呼textBox1?
因此,我想在这个类中更改textBox1的文本
如何从这个新类访问表单1?您需要对表单的实例具有一定的访问权限,才能访问其
控件的集合,从而更改文本框的
文本
其中一种方法是,您可以将窗体实例作为公共实例提供,或者更好地为第二个窗体创建一个新构造函数,并让它在初始化期间接收窗体1的实例 如果您的另一个类继承Form1,并且您的textBox1声明为公共,则您可以通过调用以下命令从另一个类访问该文本框:
otherClassInstance.textBox1.Text = "hello world";
那怎么办
Form1.textBox1.text=“更改文本”
注:
1.您必须通过以下方式将Form1“包含”到第二个表单源文件中:
使用表格1
textBox1应该是公共的
定义表单的属性,如,然后在表单实例可用的其他地方使用它
public string SetText
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
使用全局变量或属性将值分配给textbox,在另一个类中为变量提供值,并将其分配给textbox.text表单类。我建议您不要这样做。您真的想要一个依赖于表单中文本编辑实现方式的类,还是想要一个允许您获取和设置文本的机制
我建议后者。因此,在您的表单中,创建一个属性来包装所讨论的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";
}
}
更好的解决方案是在接口中定义可能的交互,并让该接口成为表单和其他类之间的契约。这样,类与表单完全解耦,并且可以使用任何实现接口的方法(这为更容易的测试打开了大门):
在你的课堂上:
class YourFormClass : Form, IYourForm
{
// lots of other code here
public string FirstName
{
get { return firstNameTextBox.Text; }
set { firstNameTextBox.Text = value; }
}
}
…和班级:
class SomeClass
{
private readonly IYourForm form;
public SomeClass(IYourForm form)
{
this.form = form;
}
// and so on
}
我找到了一个简单的方法,我已经测试过了,它工作正常。
首先,我创建了一个Windows项目,在表单上插入了一个TextBox,并将其命名为textBox1
然后我插入了一个名为button1的按钮,然后添加了一个名为class1的类。
在class1中,我创建了一个文本框:
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\u Click中,我将对象textBox1复制到txt1中,因此现在txt1具有属性
textBox1和u的组合可以在另一个窗体或类中更改textBox1文本。我也面临同样的问题,无法将文本附加到窗体类的richTextBox。因此,我创建了一个名为update
的方法,用于传递来自Class1的消息
类别: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();
}
}
班级: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
格式的引用来处理它
如果对控件属性进行任何更改,VisualStudio将不会覆盖此内容,除非您将其删除并重新创建
如果不能直接编辑代码,也可以从UI更改它。查找“修改器”属性:
我尝试了上面的例子,但没有一个像上面描述的那样有效。但是,我有一个结合了一些示例的解决方案:
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";
}
只要不使用线程,这种方法就有效。使用线程将需要更多的代码,我的任务不需要这些代码。我使用此方法更新标签,但您可以轻松地将其更改为文本框:
类别:
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;
}
}
形成将进行更新的方法:
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);
我喜欢这个解决方案。//将活动表单转换为表单变量
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";
formf1=myForm1.ActiveForm代码>
//查找CONTROL并更改属性
F1.Controls.Find(“Textbox1”,true).ElementAt(0).Text=“无论您想写什么”代码>假设textBox1是静态成员。你应该在你的回答中提到这一点。很好,但是这片土地将居住在哪里。。如果它在Form1
类中
时,您仍然需要实例
来获取此属性+1看起来很棒。。这是一个很好的和答案的组合。我如何调用类的构造函数SomeClass
将IYourForm
接口传递给它?嗨!但在这种情况下,您仍然传输表单对象,所以SomeClass代码并没有与表单代码隔离?此模式是否允许将输出转发到控制台?或者我应该使用什么来制作完全独立的记录器?@GennadyGSomeClass
不直接依赖于表单代码:它依赖于IYourForm
接口,它可能是表单,也可能是完全不同的东西。@GennadyG此讨论偏离了这个问题的主题,因此,我建议将其作为一个单独的问题(在搜索可能已经被问过和回答过的类似问题之后):-)嗨,欢迎来到StackOverflow。请仔细考虑一下你的答案(特别是,如果你有4年的时间来想出一个答案),因为解释总是有助于从错误中学习。嗨,克里斯,欢迎来到StAccess!为了帮助别人理解你的答案,考虑一下你的代码的简短描述以及它是如何解决问题的。你能更具体地问一下你的问题吗?
Form frm1 = new Form1();
frm1.Controls.Find("control_name",true)[0].Text = "I changed this from another form";