我在form1中有我的进度条。我有另一个名为process.cs的类
在主要表格中我有这两个功能......
public void SetProgressMax(int max)
{
uiProgressBar.Value = 0;
uiProgressBar.Minimum = 0;
uiProgressBar.Maximum = max;
}
public void IncrementProgress()
{
uiProgressBar.Increment(1);
}
如何从process.cs类中调用这些函数?
答案 0 :(得分:0)
您正在创建一个“紧密耦合”的解决方案,该解决方案要求process
类引用表单(在此示例中我将使用Form1
)。
所以在你的process
类中,你需要创建一个变量来存储对表单的引用,并允许一种方法来传递该引用。一种方法是使用类的构造函数:
public class process
{
private Form1 f1 = null;
public process(Form1 f1)
{
this.f1 = f1;
}
public void Foo()
{
if (f1 != null && !f1.IsDisposed)
{
f1.SetProgressMax(10);
f1.IncrementProgress();
f1.IncrementProgress();
f1.IncrementProgress();
}
}
}
以下是从process
内创建Form1
类并在以下位置传递引用的示例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
process p = new process(this);
p.Foo();
}
public void SetProgressMax(int max)
{
uiProgressBar.Value = 0;
uiProgressBar.Minimum = 0;
uiProgressBar.Maximum = max;
}
public void IncrementProgress()
{
uiProgressBar.Increment(1);
}
}
---编辑---
这是“松散耦合”事件方法的简化版本(为简单起见忽略了多线程问题):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
process p = new process();
p.Progress += p_Progress;
p.Foo();
}
void p_Progress(int value)
{
uiProgressBar.Value = value;
}
}
public class process
{
public delegate void dlgProgress(int value);
public event dlgProgress Progress;
public void Foo()
{
// ... some code ...
// calcuate the current progress position somehow:
int i = (int)((double)3 / (double)10 * (double)100); // 30% complete
// raise the event if there are subscribers:
if (Progress != null)
{
Progress(i);
}
}
}
请注意,在此方法中,流程类没有对表单的引用,也不知道正在对进度值执行了什么操作。它只是报告进度和订阅者(在这种情况下的表单)决定如何处理该信息。