为什么我的尝试失败了?
我在Form1.Designer.cs
上公开了这个public System.Windows.Forms.ProgressBar progressBar1;
我可以查看它共享表格
public partial class Form3 : Form
然后尝试更新另一个表单上的增量" form3"
Form1.progressBar1.Increment(10);
我做了一些有点奇怪的尝试,因为我看到了简单的" classname.variablename"使用其他表单中的数据...
PS。如果我很幸运能够理解你的慷慨答案......我想我能够更多地提出你的进一步建议,例如"如何尝试继承"或者"为此制作实例" ...:)
答案 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;