【问题标题】:Dynamically looping through controls has no effect动态循环通过控件没有效果
【发布时间】:2013-04-26 13:27:02
【问题描述】:

我有一个 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);
    }

【问题讨论】:

  • 您可能需要在 foreach 之后重绘表单 - frm.Invalidate()
  • 如果控件编写正确,您应该不必在执行此操作后调用Invalidate()。我通过创建一个表单、在其上放置一个按钮、一个标签和 TextBox 并添加一个执行上述代码的按钮处理程序来测试这一点。当你点击按钮时它工作正常 - 背景颜色变为 GreenYellow。
  • 不需要 Invalidate(),BackColor 属性设置器已经这样做了。在方法末尾添加这一行以查看更改:frm.Show(); Winforms 是许多程序员第一次学习面向对象编程的地方。
  • @JohnWillemse:你怎么称呼assignEvents()?调用时表单是否已经可见?
  • 问题出在其他地方,因为您发布的代码有效。

标签: c# winforms controls


【解决方案1】:

根据您的评论,您需要尝试递归地遍历每个 ControlCollection 来设置 BackColor 属性。

试着把你的代码改成这样:

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);
  }
}

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多