C# 从其他类更新UI的最佳方法?

C# 从其他类更新UI的最佳方法?,c#,winforms,.net-3.5,user-interface,C#,Winforms,.net 3.5,User Interface,我有几个嵌套类,其结构如下: BackupLocation包含备份客户端列表 BackupClient包含备份版本的列表 BackupVersions包含备份文件的列表 在我的UI中,我用BackupLocations填充一个组合框,并且有几个用于客户端、版本和文件的列表框 在处理backuplocation时,我可以轻松地更新状态栏,因为这是UI创建的顶级类。但是如何更新正在处理的每个文件的状态栏和进度栏?由于备份文件有3层,我看不到任何更新UI的方法。文件的实际处理在BackupVersio

我有几个嵌套类,其结构如下:

BackupLocation包含备份客户端列表

BackupClient包含备份版本的列表

BackupVersions包含备份文件的列表

在我的UI中,我用BackupLocations填充一个组合框,并且有几个用于客户端、版本和文件的列表框

在处理backuplocation时,我可以轻松地更新状态栏,因为这是UI创建的顶级类。但是如何更新正在处理的每个文件的状态栏和进度栏?由于备份文件有3层,我看不到任何更新UI的方法。文件的实际处理在BackupVersion类中,该类加载其文件


我认为这可能与事件和委托有关,但我不确定如何进行,任何帮助都将不胜感激。

我将使用事件,并在课堂上将它们呈现出来

基本上:

使用事件参数在每个类中创建一个事件,该事件可以处理您希望显示的特定状态更新。 推送更新时,调用事件 从上面的类中处理事件,将您想要的任何标识信息添加到事件参数中,例如:如果您想要使用2或3个状态栏,请标识它需要更新的状态栏,或者更确切地说是更新发生的级别 使用新的事件参数调用类上的事件,依此类推。 在一个非常简单的代码示例中,请参见下面的无空检查等。只是一般概念:

class A
{
    public A()
    {
        ExampleB.StatusUpdate += new EventHandler<ExampleArgs>(ExampleB_StatusUpdate);
    }

    void ExampleB_StatusUpdate(object sender, ExampleArgs e)
    {
        UpdateUI();
    }

    public B ExampleB { get; set; }

    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class B
{
    public B()
    {
        ExampleC.StatusUpdate += new EventHandler<ExampleArgs>(ExampleC_StatusUpdate);
    }

    void ExampleC_StatusUpdate(object sender, ExampleArgs e)
    {
        OnChanged(e);
    }

    public C ExampleC { get; set; }

    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class C
{
    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class ExampleArgs : EventArgs
{
    public string StatusUpdate { get; set; }
}

我会利用事件,在课堂上把它们泡起来

基本上:

使用事件参数在每个类中创建一个事件,该事件可以处理您希望显示的特定状态更新。 推送更新时,调用事件 从上面的类中处理事件,将您想要的任何标识信息添加到事件参数中,例如:如果您想要使用2或3个状态栏,请标识它需要更新的状态栏,或者更确切地说是更新发生的级别 使用新的事件参数调用类上的事件,依此类推。 在一个非常简单的代码示例中,请参见下面的无空检查等。只是一般概念:

class A
{
    public A()
    {
        ExampleB.StatusUpdate += new EventHandler<ExampleArgs>(ExampleB_StatusUpdate);
    }

    void ExampleB_StatusUpdate(object sender, ExampleArgs e)
    {
        UpdateUI();
    }

    public B ExampleB { get; set; }

    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class B
{
    public B()
    {
        ExampleC.StatusUpdate += new EventHandler<ExampleArgs>(ExampleC_StatusUpdate);
    }

    void ExampleC_StatusUpdate(object sender, ExampleArgs e)
    {
        OnChanged(e);
    }

    public C ExampleC { get; set; }

    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class C
{
    public event EventHandler<ExampleArgs> StatusUpdate;

    protected virtual void OnChanged(ExampleArgs e)
    {
        if (StatusUpdate != null)
        {
            StatusUpdate(this, e);
        }
    }
}

class ExampleArgs : EventArgs
{
    public string StatusUpdate { get; set; }
}

好的。看来我需要更多地研究事件。我已经试着读过了,但它们可能会让人困惑。这个事件有一个EventHandler,它调用一个委托,你将其附加到一个或另一个事物上,除以光速,就得到了它。@Jack-Hehe。基本上,您正在为事件分配一些自定义参数,以允许您将字符串传递回status update方法。现在,基本上发生的事情很简单。C类的最底层得到一个状态更新,然后告诉B类,B类又把它传递给a类。一旦a类有了状态,它就会更新UI。这有点像接力赛,实际上只是传递接力棒。谢谢你,说得好!今晚我将在我的常规编码时间尝试一下:P。到底是什么原因导致C类有状态更新?在代码中调用OnChanged事件?改变了吗?@C级-好吧,随你怎么想。无论何时需要状态更新,只要调用onchangednewexampleargs{StatusUpdate=Foo};例如,Hrmm Ok。看来我需要更多地研究事件。我已经试着读过了,但它们可能会让人困惑。这个事件有一个EventHandler,它调用一个委托,你将其附加到一个或另一个事物上,除以光速,就得到了它。@Jack-Hehe。基本上,您正在为事件分配一些自定义参数,以允许您将字符串传递回status update方法。现在,基本上发生的事情很简单。C类的最底层得到一个状态更新,然后告诉B类,B类又把它传递给a类。一旦a类有了状态,它就会更新UI。这有点像接力赛,实际上只是传递接力棒。谢谢你,说得好!今晚我将在我的常规编码时间尝试一下:P。到底是什么原因导致C类有状态更新?在代码中调用OnChanged事件?改变了吗?@C级-好吧,随你怎么想。无论何时需要状态更新,只要调用onchangednewexampleargs{StatusUpdate=Foo};例如