所以我有form1
有背景工作者(通过设计视图拖放)。
我可以让它在我需要的地方工作,但是我需要从公共方法中调用它。
在这个公共方法中
Utility.initpacks(object sender, EventArgs e,string formname)
我的DoWork
位于Form1
。
我表单中的公共实用程序确实做了很多事情,那么THAT函数需要再次使用Form1中的后台工作程序!
我可以复制公共方法并放在方法引用的位置,但一切都很好......但是这会破坏公共方法的目的而不是它?
任何想法都会非常感谢:)
编辑:
所以我当前的设置(没有一堆不重要的东西):
public partial class frmimportinstitutions : Form
{
private void btnNext_Click(object sender, EventArgs e)
{
Utility.initpacks(sender, e, this.FindForm().Name);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Do stuff
}
}
public static class Utility
{
public static void initpacks(object sender, EventArgs e,string formname)
{
//I WANT TO USE THE BACKGROUND WORKER HERE
//Do a public method
//I want to stop the background worker here
}
}
更新(根据评论):
刚才提到的Michael comments 将后台工作者以公共方法开头:public void startplash(string starttext)
{
if (!backgroundWorker1.IsBusy)
{
splashtext = starttext;
backgroundWorker1.RunWorkerAsync();
}
}
现在我想从其他方法调用此方法。为了做到这一点,另一个方法(init包)需要知道这个方法在哪里。 EG。
form1.startsplash("hello world")
所以现在我只需要将Form1信息发送到初始化包...
这样可以吗:
Initpacks(Form Owner)
{
Owner.startsplash("hello world")
}
另一次更新! 感谢迈克尔,我们到目前为止有这个:
public static class Utility
{
public static void RunWorkerOfForm1()
{
var target = (Form1)Application.OpenForms.OfType<Form1>().FirstOrDefault();
target?.RunWorker();
}
}
现在我需要让它以不同的形式工作..我没有尝试过以下但是这是我接下来会尝试的...如果我错了,请纠正我:
public static class Utility
{
public static void RunWorkerOfForm1(Form owner)
{
var target = (owner)Application.OpenForms.OfType<owner>().FirstOrDefault();
target?.RunWorker();
}
}
最终答案(根据勾选答案) - 但使用我的代码:
public partial class frmholidaypacks : Form, IWorker
{
private void btnextrapacks_Click(object sender, EventArgs e)
{
Utility.futurepacks<frmholidaypacks>(sender, e, pxid);
}
}
public interface IWorker
{
void startplash(string starttext);
}
public void startplash(string starttext)
{
if (!backgroundWorker1.IsBusy)
{
splashtext = starttext;
backgroundWorker1.RunWorkerAsync();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Doing work. Using Splashtext string.
}
public static void futurepacks<T>(object sender, EventArgs e, int pxid) where T : IWorker
{
var target = (T)Application.OpenForms.OfType<T>().FirstOrDefault();
target?.startplash("Creating future packs");
}
100%的积分归功于迈克尔与我一起工作!
答案 0 :(得分:0)
EDITED!
好的,现在我明白了。您要运行的每个表单都必须实现IWorker
接口。然后传递具体的Form
以用作RunWorker
函数的泛型参数。 where子句仅允许实现IWorker接口 - 它(当前)不限于Form-instances。
public partial class Form2 : Form, IWorker
{
public Form2()
{
InitializeComponent();
}
public void RunWorker()
{
if (backgroundWorker1.IsBusy) return;
backgroundWorker1.RunWorkerAsync();
}
private void button1_Click(object sender, EventArgs e)
{
UtilityX.RunWorker<Form2>();
}
}
public static class UtilityX
{
public static void RunWorker<T>() where T : IWorker
{
var target = (T)Application.OpenForms.OfType<T>().FirstOrDefault();
target?.RunWorker();
}
}
public interface IWorker
{
void RunWorker();
}
答案 1 :(得分:-1)
您是否尝试过使用静态方法, 如果您想在多个地方使用它,可以将代码放在静态方法中。
public class MyClass
{
public static void MyMethod()
{
//..
}
}