Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从窗体中删除控件_C#_Winforms_User Controls_Backgroundworker - Fatal编程技术网

C# 从窗体中删除控件

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

因此,我在从应用程序的表单中删除控件时遇到了一些严重的问题。这有点混乱,但我不能改变任何事情。我有一个表单和一个单独的用户控件。控件打开一个exe文件,并在加载其字节时显示进度条。问题来了。我使用BackgroundWorker完成所有这些工作,当调用worker\u 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对此的引用。随着事件的发生,我启动了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);//我应该这样做,但在这个概念中它不起作用。我不知道怎么做。}@弗罗斯特-我会用这个代码更新你的问题-几乎不可能阅读评论。