如何从 class C# 访问表单的控件

How to get access to form's controls from class C#

我在尝试从另一个 class 访问表单控件时遇到问题。我的程序挂在无限循环中。我知道为什么,但我不知道怎么写才正确。
这是 Form1.cs(我的表格)

public Form1()
    {
        InitializeComponent();
        Load config = new Load();

        string[] data = config.readConfig("config.ini");
        if (data.Length == 4) { //client
            Client run = new Client();
            run.startClient(data[1], Convert.ToInt32(data[2]));
        }
        else if (data.Length == 3) //server
        {
            Server run = new Server();
            run.startServer(Convert.ToInt32(data[1]));

        }
    }


public void addLog(string dataLog){
            richTextBox1.Text += dataLog;
        }

这里是 Client.cs 文件:

class Client
{

    public void startClient(string ipAddr, int port)
    {
        Form1 form1 = new Form1();

            TcpClient client = new TcpClient();
            try
            {

                form1.addLog("Connecting...");

                client.Connect(ipAddr, port);
                form1.addLog("Connected to server: " + ipAddr + ":" + port.ToString());

            }
            catch
            {
                MessageBox.Show("We couldn't connect to server");
            }

    }


}

如何在没有每次新表单时 运行 的情况下更改文本值。也许有类似 run_once?

的东西

无限循环在这里:

表格 1:

//Always runs if the config file is a certain length
Client run = new Client();

客户:

 Form1 form1 = new Form1();

每个构造函数创建另一个对象,后者又创建第一个对象,无限循环。

如果您需要向客户端获取表单对象请不要创建新对象!。它无论如何都不起作用,因为您的新表单对象对旧表单对象 一无所知。只需传入:

public Client(Form1 form)
{
   //Do whatever with it
}

//Form class
Client c = new Client(this);

免责声明:通常有更好的方法来做到这一点,但是随着您对设计的熟悉程度的提高,您会学到这些方法 patterns/architecture。