2015-06-26 3 views
0

У меня проблема, когда я пытаюсь получить доступ к элементам управления формы из другого класса. Моя программа висит в бесконечном цикле. Я знаю почему, но я не знаю, как правильно это записать.
Вот Form1.cs (к моей форме)Как получить доступ к элементам управления формы из класса C#

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?

ответ

2

Бесконечный цикл здесь:

Form1:

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

Клиент:

Form1 form1 = new Form1(); 

Каждый конструктор создает другой объект, который, в свою очередь, создает первый объект, объявление infintum.

Если вам нужно получить объект формы с клиентом не создавайте новый!. Это не работает, так как ваш новый объект формы знает ничего о старом. Просто передайте его в:

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

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

Отказ от ответственности: Есть, как правило, гораздо более эффективные способы сделать это, но вы узнаете те, как вы получите больше знакомы с узорами дизайна/архитектуры.

+0

Чтобы получить доступ к элементам управления Form1 в классе Client, вам необходимо создать внутренние свойства в Form1 или изменить свойство «Модификаторы» элементов управления, которые вы хотите обработать, на «внутренние». – Graffito

+0

@Graffito Хотя это правда, его ясный он уже имеет доступ к членам, которые ему нужны, он просто не должен был создавать новую форму в 'Client' – BradleyDotNET

Смежные вопросы