如何从另一种形式处理progressBar

时间:2014-12-10 23:23:01

标签: c#

为什么我的尝试失败了?

我在Form1.Designer.cs

上公开了这个
public System.Windows.Forms.ProgressBar progressBar1;

我可以查看它共享表格

public partial class Form3 : Form

然后尝试更新另一个表单上的增量" form3"

Form1.progressBar1.Increment(10);

我做了一些有点奇怪的尝试,因为我看到了简单的" classname.variablename"使用其他表单中的数据...

PS。如果我很幸运能够理解你的慷慨答案......我想我能够更多地提出你的进一步建议,例如"如何尝试继承"或者"为此制作实例" ...:)

2 个答案:

答案 0 :(得分:0)

您尝试的问题是您尝试通过类名访问实例成员,而不是实际的实例引用。

创建Form3实例时,需要将引用传递给Form1实例,最好是通过构造函数。 E.g:

partial class Form3 : Form
{
    private readonly Form1 _form1;

    public Form3(Form1 form1)
    {
        _form1 = form1;
    }
}

然后您可以像这样访问ProgressBar实例:

_form1.progressBar1.Increment(10);

但请注意,将progressBar1字段公开真的不是正确的做法。当您的类应设计为仅提供最小访问权限时,它为访问者提供了超出他们需要的访问权限。

最好将字段保密,并执行以下操作:

partial class Form1 : Form
{
    public void IncrementProgress(int i)
    {
        progressBar1.Increment(i);
    }
}

然后您可以像这样访问它:

_form1.IncrementProgress(10);

(当然,仍然将Form1实例传递给Form3的构造函数)。


修改

值得一提的是,我同意问题评论中表达的一般情绪,即Form3更好的方法是揭露某种进展事件,而Form1赞同这种情况,而不是要求Form3具体了解Form1类。

上面的代码示例解决了具体问题,但如果您对更好的设计感兴趣,它将看起来像这样:

partial class Form3 : Form
{
    public event EventHandler IncrementProgress;

    void SomeMethodWhereProgressHappens()
    {
        // ... make some progress

        // Then raise the progress event
        EventHandler handler = IncrementProgress;

        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }

        // ... then make some more progress, etc.
    }
}

并在您的Form1班级中:

partial class Form1 : Form
{
    void SomeMethodThatShowsForm3()
    {
        Form3 form3 = new Form3();

        form3.IncrementProgress += (sender, e) => progressBar1.Increment(10);
        form3.Show();
    }
}

请注意,在此方法中,Form3类根本没有依赖于Form3类的任何代码,Form1不需要公开{{ 1}} 任何方式的实例,甚至不是通过某种代理方法。

最后请注意,在这种情况下ProgressBar适合的原因是由于操作的回调特性。还有一些其他场景,其中一些呼叫者,例如实例化类对象本身的代码,只是想设置映射到控件属性的某些属性。在这种情况下,我作为初始解决方案显示的委托/代理方法仍然适用。在适用的时候学习和使用它是一种很好的技巧。

答案 1 :(得分:-1)

您需要在Form1上创建一个公共属性:

public ProgressBar MyProgressBar
{
    get
    {
        return progressBar1;
    }
}

然后您可以从Form3访问它:

form1.MyProgressBar.Increment(10);

您可能还需要在Form3中创建一个属性:

public Form MainForm
{
    get; set;
}

因此,当您打开Form3时,您将执行此操作:

Form3 form3 = new Form3();
form3.Show();
form3.MainForm = this;