如何从另一个C#类更新进度条?

时间:2015-05-28 03:28:55

标签: c# class methods progress-bar

我在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类中调用这些函数?

1 个答案:

答案 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);
        }
    }

}

请注意,在此方法中,流程类没有对表单的引用,也不知道正在对进度值执行了什么操作。它只是报告进度和订阅者(​​在这种情况下的表单)决定如何处理该信息。