Делегаты и элементы формы в VS2015. Теория

338
16 января 2017, 18:37

Добрый день. Читаю книгу Пола Дейтела - Полное руководство по C# за 2006 год. Дошёл до раздела с делегатами. После прочтения главы, мне на минутку показалось, что я понял тему, поскольку смог реализовать простой код, который считает до 10:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace consoledemo
{
    public delegate void TopMessage(string message); //объявление делегата. Делегат - это тип данных по ссылке.
    class Program
    {
        static void Main(string[] args)
        {
            TopMessage method = Show; // Тут объявлена ссылка на метод с совпадающей сигнатурой (Show)
            ShowMessage(10, method); //method передаётся сюда вторым параметром
        }
        static void ShowMessage(int second, TopMessage method)//TopMessage передаёт ссылку на метод совпадающей сигнатурой. method является переменной, в которой хранится ссылка
        {
            for (int i  = 0; i < second; i++)
            {
                Thread.Sleep(1000);
                method(string.Format("How long before closing the console: " + i)); //method транслирует свои сообщения в другой метод
            }
        }
        static void Show (string message) // данный метод имеет сигнатуру точно такую же, как объявлено в делегате (TopMessage)
        {
           Console.WriteLine(message);
        }
    }
}

Но поскольку Дейтел в своей книге большую часть примеров демонстрирует в консоли, я решил немного усложнить себе задачу. Я добавляю кнопку и метку. По нажатию на кнопку, в метку должно было транслироваться сообщение How long before closing the console: после чего, метка должна была становится невидимой. Если проблема с исчезновением метки вполне решаема, то реализация отображения сообщения является для меня проблемой. Если в метод Main я добавлю: label1.Text = method.ToString(); то получу заморозку окна на 10 секунд (поскольку не вывел это дело в отдельный поток), а по завершению, метка будет отображать текст Win32Demo.TopMessage. Максимум, что я смог сделать, это подключить класс MessageBox.Show.
Как мне заставить метод Show транслировать свои сообщения в свойства Button1.text , Label1.text и так далее.
Спасибо за ответы, Любитель.

Answer 1

В label1 отображается неправильный текст, потому что в ее свойство Text присваивается результат вызова метода ToString у объекта, являющегося делегатом метода. А на самом деле, в переменную текст следует поместить результат выполнения делегата: label1.Text = method();

Для этого необходимо изменить и сам делегат, и реализацию соответствующего метода.

public delegate string TopMessage(int seconds);
static string Show (int seconds)
{
  return string.Format("How long before closing the console: " + seconds);
}

Для того, чтобы не замораживать UI во время ожидания одной секунды, следует вместо метода ThreadSleep использовать компонент Timer.

READ ALSO
Изменение текста в label c# и utf8

Изменение текста в label c# и utf8

Я хочу изменить содержимое label с клавиатуры, причем иных компонентов у меня нет, исключительно один label1Вот что я имею:

458
Создание массива из TextBox

Создание массива из TextBox

Добрый день, подскажите как можно задать кол-во элементов массива из TextBox?

578
EF поле сущности не устанавливается в null

EF поле сущности не устанавливается в null

Поле Customer допускает значение nullПри попытке его устновить в null, оно остается прежним

324