Psy*_*ryo 34 c# inheritance controls class winforms
我有一个winform名为Form1和一个textbox名为textBox1
在Form1中,我可以通过键入以下内容来设置文本:
textBox1.text = "change text";
Run Code Online (Sandbox Code Playgroud)
现在我创建了另一个类.如何在此课程中调用textBox1?所以我想在这个类中更改textBox1的文本.
如何从这个新类访问Form1?
Fre*_*örk 44
我建议你不要.你真的想要一个依赖于文本编辑在表单中的实现方式的类,或者你想要一个允许你获取和设置文本的机制吗?
我会建议后者.因此,在您的表单中,创建一个包含Text相关TextBox控件属性的属性:
public string FirstName
{
get { return firstNameTextBox.Text; }
set { firstNameTextBox.Text = value; }
}
Run Code Online (Sandbox Code Playgroud)
接下来,创建一些机制,通过该机制,类可以获取对表单的引用(例如,通过构造函数).然后该类可以使用该属性来访问和修改文本:
class SomeClass
{
private readonly YourFormClass form;
public SomeClass(YourFormClass form)
{
this.form = form;
}
private void SomeMethodDoingStuffWithText()
{
string firstName = form.FirstName;
form.FirstName = "some name";
}
}
Run Code Online (Sandbox Code Playgroud)
一个更好的解决办法是定义一个接口可能存在的相互作用,并让该接口是你的形式与其他类之间的约定.这样,类就完全与表单分离,并且可以使用任何实现接口(这为更容易测试打开了大门):
interface IYourForm
{
string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在您的表单类中:
class YourFormClass : Form, IYourForm
{
// lots of other code here
public string FirstName
{
get { return firstNameTextBox.Text; }
set { firstNameTextBox.Text = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
......和班级:
class SomeClass
{
private readonly IYourForm form;
public SomeClass(IYourForm form)
{
this.form = form;
}
// and so on
}
Run Code Online (Sandbox Code Playgroud)
Pra*_*een 12
我也遇到了同样的问题,我无法将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();
}
}
Run Code Online (Sandbox Code Playgroud)
class:Class1.cs
public class Class1
{
public Class1()
{
Form1._Form1.update("change text");
}
}
Run Code Online (Sandbox Code Playgroud)
您可以更改所产生的场访问修饰符Form1.Designer.cs从private到public.改变这个
private System.Windows.Forms.TextBox textBox1;
Run Code Online (Sandbox Code Playgroud)
这样
public System.Windows.Forms.TextBox textBox1;
Run Code Online (Sandbox Code Playgroud)
您现在可以使用表单的引用来处理它Form1.textBox1.
如果对控件属性进行任何更改,Visual Studio将不会覆盖此属性,除非您将其删除并重新创建它.
如果您不能直接编辑代码,也可以从UI中获取它.寻找Modifiers属性:
您将需要对表单实例有一定的访问权限才能访问其Controls集合,从而更改Text Box's文本。
一种方法可能是您可以将表单的实例作为公共可用,或者更好地为第二个表单创建一个新的构造函数,并让它在初始化期间接收 Form1 的实例。