更改表单上的所有按钮

时间:2011-04-26 18:21:21

标签: c# winforms button controls

我已经非常接近找到解决方案了;在这一点上只缺少一个小细节。

我想做什么:
我想通过代码更改我的窗体(Form1)上的每个按钮的光标样式。我知道如何使用 foreach 搜索表单上的所有控件,但我不知道如何通过我编写的例程将此控件作为参数传递。我将在下面展示我正在做的事情。

private void Form1_Load(object sender, EventArgs e)
{
    foreach (Button b in this.Controls)
    {
        ChangeCursor(b);  // Here is where I'm trying to pass the button as a parameter.  Clearly this is not acceptable.
    }     
}

private void ChangeCursor(System.Windows.Forms.Button Btn)
{
    Btn.Cursor = Cursors.Hand;
}

可能有人给我一个提示吗?

非常感谢

埃文

6 个答案:

答案 0 :(得分:7)

更改

foreach (Button b in this.Controls)
{
    ChangeCursor(b);  // Here is where I'm trying to pass the button as a parameter.
                      // Clearly this is not acceptable.
}     

foreach (Control c in this.Controls)
{
   if (c is Button)
   {
        ChangeCursor((Button)c);  
   }
}  

并非表格上的每个控件都是按钮。

编辑:您还应该查找嵌套控件。见Bala R.回答。

答案 1 :(得分:7)

我唯一看到的是,如果你有嵌套控件,this.Controls将不会选择那些。你可以试试这个

public IEnumerable<Control> GetSelfAndChildrenRecursive(Control parent)
{
    List<Control> controls = new List<Control>();

    foreach(Control child in parent.Controls)
    {
        controls.AddRange(GetSelfAndChildrenRecursive(child));
    }

    controls.Add(parent);

    return controls;
}

并致电

GetSelfAndChildrenRecursive(this).OfType<Button>.ToList()
                  .ForEach( b => b.Cursor = Cursors.Hand);

答案 2 :(得分:2)

与Bala R的答案相同的原则,但我这样做的方式是......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace AppName
{
    public static class ControlExtensions
    {
        public static IEnumerable<Control> GetAllCtls(this Control control, Type type)
        {
            var controls = control.Controls.Cast<Control>();

            return controls.SelectMany(ctrl => GetAllCtls(ctrl, type))
                                      .Concat(controls)
                                      .Where(c => c.GetType() == type);
        }
    }
}

然后像这样使用它......

foreach (Control ctl in this.GetAllCtls(typeof(Button)))
{
    MessageBox.Show("Found a button on the form called '" + ctl.Text + "'");
}

答案 3 :(得分:1)

这对我来说是正确的;我有没有看到问题?

编辑:是啊 - 如果你在集合中有非按钮控件,那么演员表会失败。

您只希望传递 按钮的控件,因此您需要添加IF语句。

答案 4 :(得分:1)

如果你的任何控件无法从按钮继承,我认为你的foreach会抛出异常。

尝试这样的事情:

foreach (Control b in this.Controls)
{

  if (b is Button)
    ChangeCursor((Button)b);  
}    

答案 5 :(得分:1)

您还可以使用更清晰的语法:

foreach (Control c in this.Controls)    
{       
    if (c is Button)       
    {          
        ChangeCursor(c as Button);         
    }    
}