C#, MDI и его процесс загрузки

219
16 июля 2018, 20:30

Есть родительская форма EditData, и дочерняя форма DataClass. Как только открываю дочернюю форму там идет выгрузка данные с MS SQL в DataGridView, очень долго загружается. И я решил, добавить дополнительную форму Process, чтоб пользователю было понятнее, что она загружается дочерняя форма. И как только загрузилась (т.е. открылась) дочерняя форма, то тогда форма Process закрывается. Но никак не получается...

Вот пример кода, родительская форма EditData:

Process process; 
public EditData()
        {
            InitializeComponent();
        }
private void OpenClassificationWindow_Click(object sender, EventArgs e)
        {
            if (dataClass == null || dataClass.IsDisposed)
            {
                process = new Process();
                process.ShowDialog();
                dataClass = new DataClass(process)
                {
                    MdiParent = this
                };
                dataClass.Show();
            }
            else
            {
                dataClass.Activate();
            }
        }

Пример кода, дочерняя форма DataClass:

    string connection = Settings.Default.DataClient; 
    SqlConnection sqlConnection; 
    SqlCommand sqlCommand; 
    public DataClass(Process pr)
    {
        InitializeComponent();
        LoadingClass();
        pr.Close();
    }
private void LoadingClass()
    {
        sqlConnection = new SqlConnection(connection);
        string sql = "SELECT * FROM Class";
        sqlConnection.Open();
        try
        {
            SqlDataAdapter dataAdapter = new SqlDataAdapter(sql, sqlConnection);
            DataSet set = new DataSet();
            dataAdapter.Fill(set);
            TableClass.DataSource = set.Tables[0];
            sqlConnection.Close();
        }
        catch (Exception)
        {
            MessageBox.Show("Ошибка", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Dispose();
        }
        finally
        {
            sqlConnection.Close();
        }
    }

Пример кода, форма загрузки Process:

public Process()
    {
        InitializeComponent();
        Task task = Task.Run(() => Work());
    }
    public void Work()
    {
        progressBar1.Style = ProgressBarStyle.Marquee;
        progressBar1.MarqueeAnimationSpeed = 50;
    }

Но форма загрузки не закрывается, и не открывается дочерняя форма. Если вместо ShowDialog поставить на Show, то вообще не видно ProgressBar и так же самое, не закроется и не откроется дочерняя форма.

P.S. Помогите пожалуйста, как можно реализовать процесс? У меня скоро будет защита проекта...

Answer 1

Вот метод кнопки

private async void buttonShowData_Click(object sender, EventArgs e)
    {
        //готовим окно ожидания
        FormWaiting formWaiting = new FormWaiting();
        formWaiting.Owner = this;
        //показываем окно ожидания
        formWaiting.Show();
        try
        {
            //готовим окно данных
            _formData = new FormData();
            _formData.Owner = this;
            //даем команду загрзить данные
            await Task.Run(() => _formData.LoadData());
        }
        finally
        {
            //закрываем окно ожидания
            formWaiting.Close();
            formWaiting.Dispose();
            //отображаем окно с данными
            _formData.Show();
        }
    }

Вот форма, которая отображает данные

public partial class FormData : Form
{
    private Repository _repo = new Repository();
    private BindingSource _wordsSource = new BindingSource();
    public FormData()
    {
        InitializeComponent();
    }
    public void LoadData()
    {
        //тестовая пауза
        Thread.Sleep(TimeSpan.FromSeconds(3));
        //получаем из БД данные
        _wordsSource.DataSource = _repo.GetWords();
        _dataGridViewWords.DataSource = _wordsSource;
    }
}

Целиком проект можно скачать здесь.

READ ALSO
WPF в С# проблема с custom

WPF в С# проблема с custom

Есть код XAML и есть класс CustomVisualFrameworkElement, который унаследован от FrameworkElement и реализует с помощью Visual некоторые фигурыНо XAML почему то не видит...

157
Unity экземпляры класса и ссылки на объекты

Unity экземпляры класса и ссылки на объекты

Возник один вопрос по игровому движку UnityДопустим я хочу создать экземпляр класса Camera

154
С# передача файла в теле POST запроса

С# передача файла в теле POST запроса

Возникла задача отправлять email напрямую из программыПо мимо просто текста прикреплять файл лога к письму

139