Заметка о создании диалога загрузки или диалога ожидания в WinForms на языке C шарп. Довольно часто нужно отобразить ход выполнения какой либо части программы. К примеру, мы скачиваем данные из «этих ваших интырнетов» или формируем отчет. Давайте покажем пользователю ход выполнения, погнали.
Создаем новую форму в вашем проекте и называем ее frmWaitForm. Далее переносим на нее следующие элементы управления: Label и ProgressBar. В итоге внешний вид формы будет примерно таким:
Эта форма нам нужна только для отображения прогресса выполнения. поэтому никаких кнопок мы на ней ней размещаем.
Теперь нам понадобится новая форма, назовем ее Form1, на нее мы размещаем ListView и Button (кнопку). Эти контролы нам будут нужны для демонстрации примера. Форма будет выглядеть следующим образом.
Создадим свойство Worker для обработки загрузчика в для frmWaiForm.
public Action Worker { get; set; }
Action это делегат, очень похож на Func, но в отличии от Func Action не возвращает никаких значений. Другими словами, делегат Action может использоваться с методом, который имеет возвращаемый тип void.
Добавление параметра worker в конструктор frmWaitForm позволяет инициализировать свойство Worker в виде следующего кода на c #:
public frmWaitForm(Action worker)
{
InitializeComponent();
if (worker == null)
throw new ArgumentNullException();
Worker = worker;
}
И не забудьте переопределить метод OnLoad, позволяющий запустить новый поток при закрытии формы.
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//Начинаем новый поток
Task.Factory.StartNew(Worker).ContinueWith(t => { this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
}
Наконец, откройте форму Form1, затем создайте метод SaveData. Это метод симуляции хранения данных, вы можете использовать метод Thread.Sleep, чтобы задержать цикл.
void SaveData()
{
//Добавляем код для манипуляции с данными
for (int i = 0; i <= 500; i++)
Thread.Sleep(10); //Симуляция
}
И добавим обработчик на событие нажатие кнопки чтобы отобразить форму ожидания загрузки.
private void button1_Click(object sender, EventArgs e)
{
//Открываем форму с ожиданием загрузки
using (frmWaitForm frm = new frmWaitForm(SaveData))
{
frm.ShowDialog(this);
}
}
Вот что в итоге у нас получилось.