如何从另一个类访问Winform文本框控件?

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)

  • 如何调用类`SomeClass`的构造函数将它传递给`IYourForm`接口? (4认同)

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)


Mos*_*aou 9

您可以更改所产生的场访问修饰符Form1.Designer.csprivatepublic.改变这个

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属性:

修饰符


She*_*Pro 1

您将需要对表单实例有一定的访问权限才能访问其Controls集合,从而更改Text Box's文本。

一种方法可能是您可以将表单的实例作为公共可用,或者更好地为第二个表单创建一个新的构造函数,并让它在初始化期间接收 Form1 的实例。