Как изменить textbox формы из другого класса? Доброго времени суток. Мне необходимо изменять значение textbox из другого класса, смог разобраться как это делать с помощью данного видео. Единственная проблема в том, что я смог изменять значение textbox при нажатии кнопки. Вот небольшой пример:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Worker _worker;

public Form1()
{
InitializeComponent();

sendMessageButton.Click += Button1_Click;
}

private void Button1_Click(object sender, EventArgs e)
{
_worker = new Worker();

_worker.SendMessage += _worker_SendMessage1;

Thread thread = new Thread(_worker.Work);
thread.Start();

if (_worker != null)
_worker.SendMessageToTB();
}

private void _worker_SendMessage1(string mess)
{
ChatTextBox.Invoke((MethodInvoker)(() => ChatTextBox.Text += mess));
}
}

public class Worker
{
private string mess = "Кажется, ты что-то нажал...\r\n";
private bool _sendMessage = false;

public void SendMessageToTB()
{
_sendMessage = true;
}

public void Work()
{
if (_sendMessage)
{
SendMessage(mess);
_sendMessage = false;
}
}

public event Action SendMessage;
}
}
Для моей же программы нужно сделать так, чтобы значение текст бокса изменялось без всяких нажатий на кнопку. Суть в том, что как только серверу от пользователя приходит сообщение, он (сервер) должен это сообщение не только отправить всем остальным подключенным пользователям (за это отвечает метод server.BroadcastMessage), но и вывести в textbox своей формы. К сожалению сам так и не могу с этим разобраться, никак не выводится у меня текст в textbox.
Вот код программы.
Класс работы сервера:public class ClientObject
{
public event Action SendMessage;

internal string Id { get; private set; }
internal NetworkStream Stream { get; set; }
string userName;
TcpClient client;
ServerObject server;

public ClientObject() { }
public ClientObject(TcpClient tcpClient, ServerObject serverObject)
{
Id = Guid.NewGuid().ToString();
client = tcpClient;
server = serverObject;
server.AddConnection(this);
}

public void Process()
{
try
{
// Возвращаем объект NetWorkStream, используемый для отправки и получения данных
Stream = client.GetStream();

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

// Получаем данные от пользователя
while (true)
{
try
{
message = GetMessage();
message = string.Format($"{userName}: {message}");
server.BroadcastMessage(message, Id);
SendMessage(message); // Данный текст должен быть записан в textbox формы
}
catch
{
message = userName + " покинул чат.";
server.BroadcastMessage(message, Id);
SendMessage(message); // Данный текст должен быть записан в textbox формы
break;
}
}
}
catch
{
//Когда-нибудь здесь что-то будет...
}
finally
{
// Удаляем пользователя из списка подключенных пользователей и закрываем поток с соединением
server.RemoveConnection(Id);
Close();
}
}
}
Класс формы:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;

namespace Server
{
public partial class Form1 : Form
{
static ServerObject server;
static Thread listenerThread;

private ClientObject cl = new ClientObject();

public Form1()
{
InitializeComponent();

cl.SendMessage += Cl_SendMessage; // Подписываемся на событие

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

private void Cl_SendMessage(string mess)
{
chatLogTB.Invoke((MethodInvoker)(() => chatLogTB.Text += mess));
}
}
}
Очень надеюсь, что кто-нибудь поможет или подскажет как правильно реализовать то, что я хочу.

21 Авг 2019 в 07:03
286 +1
2
Ответы
1

Для того чтобы изменить значение TextBox из другого класса без нажатия на кнопку, вам нужно вызывать метод, который будет изменять значение TextBox в нужный момент. В вашем случае, в классе ClientObject у вас есть событие SendMessage, которое вызывается при получении сообщения от пользователя. В этом событии вы можете вызвать метод для изменения значения TextBox на форме.

Вам нужно создать экземпляр формы Form1 в классе ClientObject и вызвать метод изменения значения TextBox. Например, вот как это можно сделать:

В классе ClientObject добавьте свойство Form1 для хранения ссылки на экземпляр формы:

public class ClientObject
{
public Form1 MainForm { get; set; }
// остальной код
}

В классе Form1 в конструкторе передайте ссылку на экземпляр формы в экземпляр ClientObject:

public Form1()
{
InitializeComponent();
cl.MainForm = this; // передаем ссылку на экземпляр формы в экземпляр ClientObject
try
{
server = new ServerObject();
listenerThread = new Thread(new ThreadStart(server.Listen));
listenerThread.Start(); // старт потока
}
catch (Exception exc)
{
server.Disconnect();
}
}

Измените метод Process() в классе ClientObject, чтобы вызывать изменение значения TextBox:

public void Process()
{
try
{
// Возвращаем объект NetWorkStream, используемый для отправки и получения данных
Stream = client.GetStream();
// Получаем имя пользователя
userName = GetMessage();
string message = userName + " вошел в чат.";
// Рассылаем сообщение о входе в чат всем подключенным пользователям
server.BroadcastMessage(message, Id);
MainForm.Invoke((MethodInvoker)(() => MainForm.chatLogTB.Text += message)); // изменяем значение TextBox на форме
// Получаем данные от пользователя
while (true)
{
try
{
message = GetMessage();
message = string.Format($"{userName}: {message}");
server.BroadcastMessage(message, Id);
MainForm.Invoke((MethodInvoker)(() => MainForm.chatLogTB.Text += message)); // изменяем значение TextBox на форме
}
catch
{
message = userName + " покинул чат.";
server.BroadcastMessage(message, Id);
MainForm.Invoke((MethodInvoker)(() => MainForm.chatLogTB.Text += message)); // изменяем значение TextBox на форме
break;
}
}
}
catch
{
//Когда-нибудь здесь что-то будет...
}
finally
{
// Удаляем пользователя из списка подключенных пользователей и закрываем поток с соединением
server.RemoveConnection(Id);
Close();
}
}

Таким образом, при получении сообщения от пользователя, будет вызываться метод для изменения значения TextBox на форме Form1 без необходимости нажатия на кнопку. Надеюсь, это поможет вам решить вашу проблему.

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир