@skripterasm

C#. Как правильно реализовать обновление текстбокса на форме из другого класса?

Есть форма, в ней есть кнопка и текстбокс.

Задача: по нажатию на кнопку вызывается метод из другого класса, который подключается к серверу и после этого запускает в поток другой метод из этого же класса, проверяющий наличие новых данных и если что-то появилось (там будет только текст) нужно выводить их в текст бокс на форме, проблема в том, что я не могу понять как правильно нужно это написать.

Из множества вариантов у меня один раз получилось это сделать как-то через "Application.OpenForms", но потом и это перестало работать. Научите меня как НУЖНО в ООП строить подобные штуки.
  • Вопрос задан
  • 723 просмотра
Решения вопроса 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
public partial class Form1 : Form
    {
        private LongTimeJob _ltj;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _ltj = new LongTimeJob();
            button1.Enabled = false;
            _ltj.Complete += _ltj_Complete;
            _ltj.Tick += _ltj_Tick;
            _ltj.Run();
        }

        private void _ltj_Tick(object sender, TickArgs args) =>
            progressBar1.Invoke((MethodInvoker)delegate { progressBar1.Value = args.Percent; });

        private void _ltj_Complete(object sender, EventArgs args)
        {
            button1.Invoke((MethodInvoker)delegate { button1.Enabled = true; });
            textBox1.Invoke((MethodInvoker)delegate { textBox1.Text = _ltj.Text; });
        }
    }

    public class LongTimeJob
    {
        public int Percent { get; private set; }
        public string Text { get; private set; } = "";
        public void Run()
        {
            Percent = 0;
            Task.Run(async () => await Download());
        }

        private async Task Download()
        {
            for (var i = 0; i < 9; i++)
            {
                Percent = i * 10;
                Text += $"Download: {i}\r\n";
                OnTick(Percent);
                await Task.Delay(400);
            }

            await Parse();
        }

        private async Task Parse()
        {
            Percent = 100;
            Text += "Parsing\r\n";
            OnTick(Percent);
            await Task.Delay(500);
            OnComplete();
        }
        public event TickDelegate Tick;
        protected virtual void OnTick(int percent)
        {
            Tick?.Invoke(this, new TickArgs(percent));
        }
        public event CompleteDelegate Complete;
        protected virtual void OnComplete()
        {
            Complete?.Invoke(this, new EventArgs());
        }
    }

    public delegate void TickDelegate(object sender, TickArgs args);

    public delegate void CompleteDelegate(object sender, EventArgs args);

    public class TickArgs : EventArgs
    {
        public TickArgs(int percent)
        {
            Percent = percent;
        }
        public int Percent { get; private set; }
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
В ООП, точнее MVVM - меняют классы/поля классов, которые связаны (binding) с визуальными элементами. Обычно mvvm увязывают с WPF, но сам смысл подхода может быть использован и не в wpf.
Ответ написан
Ваш ответ на вопрос

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

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