@haintass
IT-падаван

Как изменить объект формы из другого класса?

Нужно изменять значение textbox из другого класса, но никак не могу это сделать. Поискав в гугле понял, что это можно сделать с помощью событий или изменив модификатор доступа textbox в свойствах на public, а затем создав в классе объект формы и через него изменять значение textbox, что у меня не вышло. Помогите пожалуйста решить проблему.

Вариант 1:

public class ClientObject
{
    public delegate void MethodChatLog(string message);
    public event MethodChatLog writeInChatLog;

    ...

    public void Process()
    {

        Form1 form1 = new Form1();

        try
        {
            Stream = client.GetStream();

            // Получаем имя пользователя
            userName = GetMessage();
            string message = userName + " вошел в чат.";
            // Рассылаем сообщение о входе в чат всем подключенным пользователям
            server.BroadcastMessage(message, Id);
            writeInChatLog(message); // здесь сообщение должно передаваться в textbox формы, но увы
  ...

public partial class Form1 : Form
{
    ClientObject clientObject = new ClientObject();

    static ServerObject server;
    static Thread listenerThread;

    public Form1()
    {
        InitializeComponent();

        try
        {
            server = new ServerObject();
            listenerThread = new Thread(new ThreadStart(server.Listen));
            listenerThread.Start(); // старт потока
        }
        catch (Exception exc)
        {
            server.Disconnect();
        }

        clientObject.writeInChatLog += MessageChatLog;
    }

    public void MessageChatLog(string message)
    {
        chatLogTB.Text += message + "\r\n";
    }
}


Вариант 2:
...
public void Process()
    {
        Form1 form1 = new Form1();

        try
        {
            Stream = client.GetStream();

            // Получаем имя пользователя
            userName = GetMessage();

            string message = userName + " вошел в чат.";
            server.BroadcastMessage(message, Id);
            form1.chatLogTB.Text += message; // ничего не изменяет
...

Также делал модификатор textbox приватным и изменял значение textbox через публичное свойство, но это ни к чему не привело.
  • Вопрос задан
  • 1609 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Контролы нужно изменять только из того треда, в котором они создаются, то есть в основном потоке!
Можно оборачивать изменяющий код в делегаты Action и передавать в Control.Invoke() формы. Пример
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы