Удаление элемента управления из формы - PullRequest
0 голосов
/ 24 октября 2009

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

BackGround_Loader bgLoad = new BackGround_Loader();
bgLoad.Location = new Point(this.Width/2 - bgLoad.Width/2, this.Height/2 - bgLoad.Height/2);
this.Controls.Add(bgLoad);
bgLoad.BringToFront();
bgLoad.AddReferences(this.executableFile, this.SourceReader);
bgLoad.occuredEvent();

Сначала я установил расположение элемента управления в середине самой формы. Затем я добавляю элемент управления в форму и выводю его на передний план. После этого я отправляю путь к исполняемому файлу и ссылку RichTextBox на это. С событием occuredEvent я запускаю сам BackgroundWorker. И тут возникает моя проблема. Я должен показать MessageBox в форме, когда в bgLoad фоновый работник получает статус DoWorkerCompleted. Пожалуйста, я понятия не имею, как это сделать. Он работает просто отлично, но управление остается в середине формы.

Ответы [ 2 ]

1 голос
/ 24 октября 2009

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

Вам нужно что-то вроде следующего кода:

private void backgroundWorker_DoWork(object sender, AlbumInfoEventArgs e)
{
    // Check with an element on the form whether this is a cross thread call
    if (dataGridView.InvokeRequired)
    {
        dataGridView.Invoke((MethodInvoker)delegate { AddToGrid(e.AlbumInfo); });
    }
    else
    {
        AddToGrid(e.AlbumInfo);
    }
}

В этом случае AddToGrid - это мой метод добавления строки в DataGridView, но в вашем случае это будет метод, который делает то, что вам нужно.

Аналогично для backgroundWorker_RunWorkerCompleted метода

См. Пример MSDN

0 голосов
/ 25 октября 2009

Я мог бы найти способ решить проблему, но мне это не очень нравится. В методе addReferences я передаю саму форму и объект класса bgLoad. Затем в RunWorkerCompleted я проверяю, находится ли элемент управления в форме, и если это так, я удаляю его.

bgLoad.AddReferences(this, bgLoad, this.executableFile, this.SourceReader);

...
private void worker_DoWorkerCompleted(object sender, DoWorkerEventArgs e) {
    if(this.MainForm.Controls.Contains(this.Control) {
        this.MainForm.Controls.Remove(this.Control);
    }
}

Как это работает, но для меня это ужасно.

...