我有一个对象,在我的form1窗口中调用。如何从此对象中的form1-object更改任何内容,例如标签或进程栏?
答案 0 :(得分:5)
给对象提供表单是一种糟糕的(循环)设计。使用接口或委托(回调)。
// untested code
class MyObjectClass
{
public delegate void Reportback(int percentage);
public void DoSomething(Reportback callBack) { ...; callback(i*100F/total); ...}
}
class Form1: Form
{
private void reportProgress(int percent) { ...; progressbar1.value = percent; }
void SomeMethod() { myObject1.DoSomething(reportprogress); }
}
答案 1 :(得分:1)
一般来说,当你发现自己需要一个对象来操纵另一个对象的私有字段时,你的设计需要工作。
例如,正在执行某种长期运行的业务逻辑的类不应该更新ProgressBar
。首先,那不是它的工作。其次,它将业务逻辑的功能与用户界面的实现细节相结合。
如果类在执行其长时间运行的任务时简单地引发事件,那就更好了。例如,看看这个类:
public class BusinessLogic
{
public event EventHandler ProgressChanged;
private int _Progress;
public int Progress
{
get { return _Progress; }
private set
{
_Progress = value;
EventHandler h = ProgressChanged;
if (h != null)
{
h(this, new EventArgs());
}
}
}
}
每当此类中的任何方法设置Progress
属性时,都会引发ProgressChanged
事件。在您的表单中,您可以使用以下逻辑实例化对象:
private BusinessLogic Task;
private void Form1_Load(object sender, EventArgs e)
{
Task = new BusinessLogic();
Task.ProgressChanged += Task_ProgressChanged;
}
void Task_ProgressChanged(object sender, EventArgs e)
{
taskProgessBar.Value = ((BusinessLogic) sender).Progress;
}
现在,每次Task
对象中的方法设置Progress
属性时,表单中的ProgressBar
都会更新。
这只是编写更多代码,而不仅仅是让对象更新ProgressBar
,当然。但看看你从中获得了什么。如果您必须将表单重构为两个表单,并将任务移动到新表单,则不必触摸BusinessLogic
类。如果您将ProgressBar
从表单上的控件移动到ToolStripProgressBar
上的ToolStrip
,则无需触及BusinessLogic
课程。如果您认为进度报告不重要,则无需触摸BusinessLogic
课程。
基本上,这种方法可以保护BusinessLogic
类不必知道有关用户界面的任何。这使得随着程序的发展更改业务逻辑和用户界面变得更加容易。
答案 2 :(得分:0)
我同意Henk ......但无论如何,如果您更改控件的可见性,您可以修改表单上的任何项目,甚至还有一个属性可以执行此操作。