当我试图从另一个类访问表单的控件时,我遇到了问题。我的程序挂在无限循环中。我知道为什么,但我不知道怎么写得正确。
这是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的东西?
答案 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);
免责声明:通常有更好的方法可以做到这一点,但随着您越来越熟悉设计模式/架构,您将学习它们。