C# 从窗体中删除控件
因此,我在从应用程序的表单中删除控件时遇到了一些严重的问题。这有点混乱,但我不能改变任何事情。我有一个表单和一个单独的用户控件。控件打开一个exe文件,并在加载其字节时显示进度条。问题来了。我使用BackgroundWorker完成所有这些工作,当调用worker\u DoWorkerCompleted方法时,原始表单应该显示一个MessageBox并删除该控件C# 从窗体中删除控件,c#,winforms,user-controls,backgroundworker,C#,Winforms,User Controls,Backgroundworker,因此,我在从应用程序的表单中删除控件时遇到了一些严重的问题。这有点混乱,但我不能改变任何事情。我有一个表单和一个单独的用户控件。控件打开一个exe文件,并在加载其字节时显示进度条。问题来了。我使用BackgroundWorker完成所有这些工作,当调用worker\u DoWorkerCompleted方法时,原始表单应该显示一个MessageBox并删除该控件 BackGround_Loader bgLoad = new BackGround_Loader(); bgLoad.Location
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对此的引用。随着事件的发生,我启动了BackgroundWorker本身。我的问题来了。当backgroundworker进入DoWorkerCompleted状态时,我应该在窗体中显示一个MessageBox。好心的,我不知道怎么做。它的工作非常完美,但是控件停留在窗体的中间。
UI操作必须在主UI线程上执行。从后台工作线程引发的事件(显然)位于不同的线程中 您需要类似以下代码的代码: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\u RunWorkerCompleted
方法
看这个我能找到解决问题的方法,但我真的不喜欢。在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);
}
}
就像这样,它很有效,但对我来说很糟糕。我想我不清楚。让我把我的问题说得更准确些。我有两节课。一个用于我的应用程序的主窗体,另一个用于使用一个简单窗体加载文件的控件,该窗体上有一个进度条。当出现openFile事件时,主窗体调用该控件。使用它生成控件的表单。该控件使用backgroundworker加载文件。我想做的是在控件本身发生RunWorkerCompleted事件时删除该控件。所以我的问题是:我必须从窗体中移除控件。但是从控件本身移除控件。它有点乱。我需要这样的东西:公共部分类Form1{….BackGround\u Loader bgLoad=new BackGround\u Loader();bgLoad.AddReferences(this.executable,this.SourceReader);bgLoad.occreevent();//启动BackgroundWorker}公共部分类BackGround\u Loader{private BackgroundWorker worker=new BackgroundWorker();…private void worker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e){Form1.Controls.Remove(bgLoad);//我应该这样做,但在这个概念中它不起作用。我不知道怎么做。}@弗罗斯特-我会用这个代码更新你的问题-几乎不可能阅读评论。