从另一个类调用的方法不起作用

时间:2012-12-10 17:15:06

标签: c# class methods

我有两个班级:

mainGUIpreferencesGUI

每次按下mainGUI按钮时,我想调用名为updateGUI的{​​{1}}类中的方法。但是,当我尝试这样做时,没有任何反应。

以下是我的课程:

updateGUI:

applychanges

来自preferencesGUI的按钮点击事件处理程序:

public void updateGUI()
{
    String[] colors = (Regex.Split(File.ReadAllText(prefpath), ","));
    int[] colori = new int[colors.Length];
    for (int x = 0; x < colors.Length; x++)
    {
        colori[x] = Convert.ToInt32(colors[x].ToString());
    }
    preferencesGUI pg = new preferencesGUI();
    pg.R1 = colori[0]; 
    pg.G1 = colori[1];
    pg.B1 = colori[2];
    pg.R2 = colori[3]; 
    pg.G2 = colori[4]; 
    pg.B2 = colori[5];
    outputbox.ForeColor = Color.FromArgb(colori[0], colori[1], colori[2]);
    outputbox.BackColor = Color.FromArgb(colori[3], colori[4], colori[5]);
    eventlist.ForeColor = Color.FromArgb(colori[0], colori[1], colori[2]);
    eventlist.BackColor = Color.FromArgb(colori[3], colori[4], colori[5]);
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

首先,我假设当preferGUI进行此调用时,mainGUI已经打开。所以当你这样做时:

private void applychanges_Click(object sender, EventArgs e)
{
        mainGUI mg = new mainGUI();
        mg.updateGUI();
}

你所做的只是创建一个新的mainGUI实例,然后让它超出范围,是的,它什么都不做。

这是GUI开发中非常常见的障碍。如何让不同的组件相互了解。人们最初尝试的一种方法是单身人士。但是,如果您想要组件的多个实例,这可能会导致问题,实际上它只是一种混乱。更好的想法是传入控件的实例,但这种设计不是很模块化,因为它要求preferencesGUI类知道mainGUI类。

相反,您应该在您的preferencesGUI中创建一个事件,如下所示:

class preferencesGUI
{
    // ... Some code ...
    public event Action RequestGUIUpdate;
    protected void OnRequestGUIUpdate() { if (this.RequestGUIUpdate == null) return; RequestGUIUpdate(); }

    // ... Some more code ...

    private void applychanges_Click(object sender, EventArgs e)
    {
        OnRequestGUIUpdate();
    }

    // ... Some more code ...
}

现在,preferencesGUI能够通知何时需要进行GUI更新。因此,当您从mainGUI创建preferencesGUI实例时,请附加一个事件处理程序,如下所示:

preferencesGUI preferences = new preferencesGUI();
preferences.RequestGUIUpdate += new Action(updateGUI);