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

时间:2015-06-26 17:11:19

标签: c# winforms infinite-loop

当我试图从另一个类访问表单的控件时,我遇到了问题。我的程序挂在无限循环中。我知道为什么,但我不知道怎么写得正确。
这是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 个答案:

答案 0 :(得分:2)

无限循环在这里:

Form1中:

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

客户端:

 Form1 form1 = new Form1();

每个构造函数都会创建另一个对象,该对象又会创建第一个对象ad adintum。

如果您需要将表单对象提供给客户端,请不要创建新对象!。它无论如何都不起作用,因为您的新表单对象知道没有关于旧表单。只需将其传递给:

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

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

免责声明:通常有更好的方法可以做到这一点,但随着您越来越熟悉设计模式/架构,您将学习它们。