Изменить все кнопки на форме - PullRequest
4 голосов
/ 26 апреля 2011

Я очень близко подошел к решению этого вопроса;на данный момент я просто упускаю одну незначительную деталь.

Что я пытаюсь сделать:Я хочу изменить стиль курсора каждой кнопки на моей Форме (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 ]

7 голосов
/ 26 апреля 2011

Единственное, что я вижу, это то, что если у вас есть вложенные элементы управления, 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);
7 голосов
/ 26 апреля 2011

Изменить

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

Не каждый элемент управления в форме является кнопкой.

Редактировать: Вам также следует искать вложенные элементы управления.См. Бала Р. Ответ.

2 голосов
/ 22 февраля 2017

Тот же принцип, что и в ответе Бала Р, но способ, которым я делаю это ...

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 + "'");
}
1 голос
/ 26 апреля 2011

Вы также можете использовать для более чистого синтаксиса:

foreach (Control c in this.Controls)    
{       
    if (c is Button)       
    {          
        ChangeCursor(c as Button);         
    }    
} 
1 голос
/ 26 апреля 2011

Если какой-либо из ваших элементов управления не наследуется от кнопки, я думаю, что ваш foreach выдаст исключение.

попробуйте что-то вроде этого:

foreach (Control b in this.Controls)
{

  if (b is Button)
    ChangeCursor((Button)b);  
}    
1 голос
/ 26 апреля 2011

Это выглядит правильно для меня; есть ли проблема, которую я не вижу?

РЕДАКТИРОВАТЬ: Ах да - если у вас есть не-кнопки управления в коллекции, приведение не удастся.

Вы хотите передать только те элементы управления, которые являются кнопками , поэтому вам нужно добавить оператор IF.

...