2013-05-02 82 views
3

我有一个GUI类。我将一个frmMain(表单)传递给GUI构造器。然后,我有如下的方法来访问子控件:动态循环控件不起作用

public void assignEvents(frmMain frm) 
{ 
    foreach (Control ctl in frm.Controls) 
    { 
     ctl.BackColor = Color.GreenYellow; 
     Log.AddData(ctl.Name.ToString() + ".Backcolor = " + ctl.BackColor.ToString(), 3); 
    } 
} 

我得到的输出(日志)新新的色,但它需要的控件没有影响,他们仍然在默认的颜色。任何想法我做错了什么?

编辑:

我这样称呼它:基于您的评论

// GUI.cs 
    public class GUI { 
     public GUI(frmMain frm){ 
      assignEvents(frm); 
     } 
    } 

    // frmMain.cs 
    public frmMain() 
    { 
     InitializeComponent(); 
     gui = new M.Gui (this); 
    } 
+2

你可能需要重新绘制表格 - 'frm.Invalidate()'在foreach – Sayse 2013-05-02 11:32:32

+0

后,您应该*不*需要调用'的Invalidate()'这样做后,如果控件编写正确。我通过创建一个表单,放下一个按钮,一个标签和TextBox并添加一个执行上述代码的按钮处理程序来测试它。当你点击按钮时它工作正常 - 背景颜色变为GreenYellow。 – 2013-05-02 11:50:51

+1

无需Invalidate(),BackColor属性设置器已经做到了。在该方法的末尾添加以下行以查看更改:'frm.Show();'Winforms是许多程序员首先了解面向对象的编程的地方。 – 2013-05-02 11:55:27

回答

0

,你需要尝试通过每个递归的ControlCollection去设置背景色属性。

试着改变你的代码是这样的:

public GUI(frmMain frm) { 
    assignEvents(frm.Controls); 
} 

public void assignEvents(Control.ControlCollection controls) { 
    foreach (Control ctl in controls) { 
    ctl.BackColor = Color.GreenYellow; 
    assignEvents(ctl.Controls); 
    } 
}