C#如何从另一个类调整表单中的textbox属性?

Psy*_*ryo 4 c# controls properties object winforms

我仍然无法获得如何从另一个class.im新的c#访问表单中的控件,所以我的"尝试和错误"方法实际上没有工作.

谁能给我一个简单的指南?

这是我的代码片段

Form1中:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            print pr = new print();
            pr.p();

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这是类打印:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication2
{
    class print 
    {
        public print()
        {

        }

        public void p()
        {
            Form1 f = new Form1();
            f.textBox1.Text = "change text";

        }     

    }

}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我试图改变print类中的textBox1属性.但是当我编译它时,我抛出一个System.StackOverflowException!

我现在感到沮丧,因为我无法从另一个班级访问它.

任何人都可以一步一步地告诉我如何从打印类调用它?我尝试了从互联网上的许多步骤,但我不能得到它.

顺便说一句,我确实将文本框的修饰符设为公开.

Cod*_*ray 5

问题是该print.p方法创建了一个新表单,表单的构造函数print.p再次调用该方法.然后创建另一个新表单,其构造函数print.p再次调用该方法,循环遍历.这就是它的StackOverflowException来源.

解决方案是获得一本教授面向对象编程的书.我知道这可能听起来很讽刺或无益,但你在问答网站上得到的答案都不能充分向你解释为什么你要做的事情是个坏主意.外部辅助类,比如print应该能够与你的窗体类的私有成员一塌糊涂.相反,您应该在表单类上调用进行这些修改的公共方法.

快速而肮脏的修复要求您找到一种方法来获取print.p方法中表单类实例的引用.这是您能够在对象上调用方法的唯一方法,而不是创建该类的对象.一种方法是将引用作为参数传递给方法:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        print pr = new print();
        pr.p(this);
    }
}

class print 
{
    public print()
    {

    }

    public void p(Form frm)
    {
        frm.textBox1.Text = "change text";
    }     
}
Run Code Online (Sandbox Code Playgroud)

另外,作为一个有点不相关的风格注释,您应该知道几乎所有C#(和.NET平台)的编码指南/约定都要求类和方法的名称是PascalCased,而不是camelCased.所以,你的print班级实际上应该被命名Print.