如何从另一个对象中更改表单的组件?

时间:2009-03-14 14:05:59

标签: c#

我有一个对象,在我的form1窗口中调用。如何从此对象中的form1-object更改任何内容,例如标签或进程栏?

3 个答案:

答案 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 ......但无论如何,如果您更改控件的可见性,您可以修改表单上的任何项目,甚至还有一个属性可以执行此操作。