关于c#:如何从另一个类访问Winform文本框控件?

How to access Winform textbox control from another class?

我有一个叫form1的winform和一个叫textbox的textbox

在Form1中,我可以通过键入以下内容来设置文本:

1
textBox1.text ="change text";

现在我创建了另一个类。在这个类中如何调用textbox 1?所以我想更改这个类中textbox 1的文本。

如何从这个新类访问Form1?


我建议您不要这样做。您真的想要一个依赖于文本编辑在表单中的实现方式的类,还是想要一个允许您获取和设置文本的机制?

我建议后者。因此,在您的表单中,创建一个包含所讨论的TextBox控件的Text属性的属性:

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。所以我创建了一个名为update的方法,在这里我用来传递来自Class1的消息。

类: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");
        }        
    }


可以将Form1.Designer.cs中生成字段的访问修饰符从private更改为public。改变这个

1
private System.Windows.Forms.TextBox textBox1;

以此

1
public System.Windows.Forms.TextBox textBox1;

您现在可以使用Form1.textBox1格式的引用来处理它。

如果对控件属性进行任何更改,Visual Studio将不会覆盖此内容,除非将其删除并重新创建。

如果您不习惯直接编辑代码,也可以从用户界面进行更改。查找Modifiers属性:

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; }
}


您需要对表单实例进行一些访问,才能访问其Controls集合,从而更改Text Box's文本。

其中一种方法是,您可以将表单的实例作为公共实例使用,或者更好地为第二个表单创建一个新的构造函数,并让它在初始化期间接收表单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
Class1 c = new Class1(this);

1
2
Form1 form = new Form1();
form.textBox1.Text ="test";


使用全局变量或属性将值赋给文本框,为另一个类中的变量赋值,并将其赋给窗体类中的textbox.text。


如果您的另一个类继承了Form1,并且您的text box 1被声明为public,那么您可以通过简单的调用从另一个类访问该文本框:

1
otherClassInstance.textBox1.Text ="hello world";


怎么样

form1.textbox 1.text="更改文本";

注:1。您必须将表单1"包括"到第二个表单源文件使用Frim1;

  • 文本框1应该是公共的