VB.net формирует приложение ... какое событие использовать при загрузке исходных данных - PullRequest
0 голосов
/ 23 мая 2011

Я пишу форму заявки. Я добавляю кусок, который позволяет вам дважды щелкнуть строку элемента управления сеткой данных, чтобы открыть новую форму с более подробной информацией. Эти дополнительные сведения извлекаются из базы данных, на завершение которой требуется некоторое время.

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

Я хочу, чтобы форма отображалась мгновенно при двойном щелчке, а все поля заполнялись, как только данные были готовы.

Есть ли событие, которое я должен использовать, кроме Load?

Ответы [ 6 ]

1 голос
/ 23 мая 2011

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

0 голосов
/ 23 мая 2011

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

0 голосов
/ 23 мая 2011

Хотя правильный способ сделать это - поток BackgroundWorker, быстрый и грязный метод состоит в том, чтобы запустить таймер для события Load и получить данные после его истечения. Скажем, 10 мс достаточно для рисования формы, тогда вы можете отключить элементы управления и установить курсор на занят, пока вы получаете данные. Но это все еще блокирует поток пользовательского интерфейса, пока база данных занята, что приводит к перерисовке артефактов, например, если часть окна закрыта, и не позволяет отображать прогресс с помощью индикатора выполнения.

0 голосов
/ 23 мая 2011

Это пример c #, использующий BackgroundWorker в качестве других упомянутых постов, который загружает определения единиц из .xml файла и изменяет метку состояния после его завершения.Я застрял в Intializer формы, но, может быть, лучше запустить его в OnLoad() переопределении.

    public MainForm()
    {
        InitializeComponent();

        BackgroundWorker bw = new BackgroundWorker();
        bw.WorkerReportsProgress = false;
        bw.WorkerSupportsCancellation = false;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new  RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        unitsToolStripLabel.Text = "Loading Units";
        bw.RunWorkerAsync();
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        ...
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        unitsToolStripLabel.Text = string.Format("{0} Units Loaded", Units.UnitLibrary.WorkingSet.Count);
        unitsToolStripLabel.LinkBehavior = LinkBehavior.HoverUnderline;
        unitsToolStripLabel.Click += new EventHandler(unitsToolStripLabel_Click);
    }

Пожалуйста, объясните немного больше, почему вы не хотите использовать многопоточность / backgroundworker?

0 голосов
/ 23 мая 2011

Вы должны использовать BackgroundWorker для загрузки данных в фоновом потоке без блокировки пользовательского интерфейса.

Если вы действительно хотите загрузить поток UI, вы должны обработать событие Shown.

0 голосов
/ 23 мая 2011

Вы должны использовать многопоточность.Начните поток, чтобы выполнить поиск данных в событии загрузки формы. Введение в резьбу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...