通过另一个类访问表单

时间:2011-06-28 08:19:10

标签: c# winforms

请原谅我,如果这有点乱,我在Windows Forms上有点新,在ASP.NET上花了几个月

基本上,我在Windows窗体应用程序中使用Quartz.NET - 当一个作业执行时,它会触发另一个类文件 - 它传入的参数不包含对表单的引用,我不认为我可以改变这一点。

我想要做的是在作业执行后刷新页面上的网格 - 并且'告诉'我已经执行了作业的唯一地方是在其他文件中,而不是表单代码。我不知道如何在不启动它的新实例的情况下访问表单上的方法/对象,我不想这样做。

编辑:总结一下,我只是想要一种方法从另一个类中向已经打开的主表单发送消息或其他东西

3 个答案:

答案 0 :(得分:1)

为什么不将课堂上的活动提升为winform。这是优雅的方式来做到这一点。要发送消息,您可以使用interop来调用需要窗口句柄的sendMessage

答案 1 :(得分:0)

Actualy,如果一个类的成员不是static,那么如果没有该类的实例,您将无法访问它们。尽量确定你的行为适用于该类的同一个实例。

答案 2 :(得分:0)

最简单的方法是将主窗体的实例传递给使用Quartz.NET事件的类,这样消费类就可以调用主窗体上的方法。我猜这个类无论如何都会以某种形式在主窗体中创建,所以它会是这样的:

var quartzConsumer = new QuartzConsumer(this);

...
class QuartzConsumer {
    MainForm _form;
    public QuartzConsumer(MainForm form) {
        _form = form;
        ...
    }
    void OnTimer(..) {
        _form.UpdateGrid();
    }
}

编辑为@hundryMind说,另一个解决方案是主表单订阅消费类上的事件:

class QuartzConsumer {
    public delegate void DataChangedEventHandler();
    public event DataChangedEventHandler DataChanged;
    void OnTimer(..) {
        if (this.DataChanged != null) this.DataChanged();
    }
}

// in MainForm:
var quartzConsumer = new QuartzConsumer(..);
quartzConsumer.DataChanged += this.OnDataChanged;
...
void OnDataChanged() {
    // update the grid
}