Как сделать загрузку элементов формы (windows forms) без задержки?

111
28 ноября 2020, 21:00

У меня есть программа написанная на windows forms , которая при запуске грузит данные из *.txt файла (объем файла постепенно увеличивается) и отображает их после загрузки в таблице dataGriedView.

Так вот, проблема в том, что данные при запуске формы отображаются с задержкой небольшой. Во время запуска программы, форма прогружается сначала пустая, а остальное появляется с небольшой задержкой.

Как сделать это более красивее? Как показать форму именно тогда, когда все данные будут загружены и готовы к показу и без задержки?

Answer 1

Любой из этих вариантов должен решить твою проблему:

  • Сделай заставку и показывай ее до момента пока не прогрузятся данные, а потом уже показывай вторую форму с самими данными.

    в program.cs подгружаешь данные в асинхронном методе. Обновляя при этом переменную с ходом загрузки. Как только загрузка достигнет 100% закрываем форму-заставку и открываем MainForm.

  • Перемести данные в место с которого они будут грузится быстрее. Например в БД. Или сериализованный файл ( можно подсмотреть код вот здесь Сериализация и десериализация не работают ) -- бинарные файлы обрабатываются быстрее текста.

  • Не грузи ВСЕ данные. Грузи только то что прям сейчас нужно отображать -- т.е. сделай его виртуальным. И то грузи эти данные в левый посредник, а потом отрисовывай данные из этого посредника в DataGridView через DataSource.

    Переключи DGV в виртуал моуд через блок пропертей в вижуал студио, а потом напиши реализацию:

    private void dataGridView1_CellValueNeeded(
    

    собственно, в интернете туториалов с примерами кода просто нереально много в т.ч. есть в документации мелкософта. Иначе -- гугли "datagridview virtual example".

Answer 2

Одним из вариантов решения данной проблемы может выступать сериализация. Ниже приведен один из примеров бинарной сериализации при помощи BinaryFormatter, который находится в пространстве имен System.Runtime.Serialization.Formatters.Binary. Также сериализуемый класс должен быть помечен атрибутом [Serializable]. Еще примеры бинарной сериализации можно найти: здесь и здесь.

         //Сериализация
        BinaryFormatter formatter = new BinaryFormatter(); // создаем объект BinaryFormatter
        string fileName = Test.Name.Trim(System.IO.Path.GetInvalidFileNameChars()).TrimEnd((System.IO.Path.GetInvalidFileNameChars()));
        string path = $"{Environment.CurrentDirectory}" + "\\Tests\\" + $"{fileName}.dat"; //Собираемый полный путь до файла куда будем сериализовать 
        try
        {
            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate)) // создаем объект FileStream для записи в файл.
            {
                formatter.Serialize(fs, Test); //Вызываем у formatter метод Serialize, который принимает объект FileStram и сериализуемый объект
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return;
        }
    //Десериализация
    OpenFileDialog openFileDialog = new OpenFileDialog(); // в данной программе использовался OoenFileDialog для поиска файлов для десериализации.
        openFileDialog.Filter = "(*.dat)|*.dat";
        openFileDialog.InitialDirectory = testsDirectory.FullName;
        if (openFileDialog.ShowDialog() == true)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            Test test;
            try
            {
                using (FileStream fs = new FileStream(openFileDialog.FileName, FileMode.OpenOrCreate)) //Здесь FileStream инициализируется путем полученным из OpenFileDialog. Можно использовать константный путь к файлу.
                {
                    test = (Test)formatter.Deserialize(fs); //Вызываем функцию Deserialize, которая принимает FileStream и возвращает object. Приводим к типу который был сериализован.
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
READ ALSO
Система смены пароля пользователя на MySQL

Система смены пароля пользователя на MySQL

Делаю меню смены пароля пользователя на MySQLВ принципе все работает, но если я указываю что бы оно меняло на то что ввёл пользователь в input,...

142
Как воспользоваться $wpdb и работать с БД в своем file.php

Как воспользоваться $wpdb и работать с БД в своем file.php

Подскажите, как этим воспользоваться в filephp, добавленном в папку с темой

129
Загрузка файла (PHP)

Загрузка файла (PHP)

Почему функция записывает в начало возвращаемого файла HTML код моей страницы, а уже потом дописывается сам файлВ чём может быть проблема?...

100