akosisugar Ответов: 2

C# настройка всех кнопок в различных формах


я пытаюсь использовать свой публичный метод для каждой формы. то, что я хочу, - это когда метод вызывается, найти все кнопки в форме и воспроизвести системный звук в каждой кнопке, когда она нажата.

Что я уже пробовал:

public static void setButtons(Form  f)
{
    foreach (Control c in f.Controls)
    {
        Button btn = c as Button;

        if (c == btn)
        {
            System.Media.SystemSounds.Beep.Play();
        }
    }
}

2 Ответов

Рейтинг:
7

________________

public static void setButtons(Form  f)
        {
            foreach (Control c in f.Controls)
            {
                Button btn = c as Button;
 
                if (c == btn)
                {
					btn.Click += btn_Click;
                }
            }
        }

		static void btn_Click(object sender, EventArgs e)
		{
			System.Media.SystemSounds.Beep.Play();
		}


akosisugar

я вызываю метод в событии form_load.. ваш код не работает

________________

Я вызываю setButtons(Form f) из конструктора формы:


публичный частичный класс Form2 : форма
{

публичная форма 2(object dataToShow)
{
метод InitializeComponent();
//dataGridView1.Источник данных = dataToShow;
setButtons(это);
}


public static void setButtons(форма f)
{
foreach (Control c in f.Controls)
{
Кнопка btn = c as кнопка;

если (c == btn)
{
БТН.Нажмите кнопку += btn_Click;
}
}
}

статический недействительным btn_Click(объект отправителя, EventArgs в электронной)
{
Система.Средства массовой информации.SystemSounds.Звуковой сигнал.Играть();
}


}

Вы понимаете, что такое событие в .NET?


________________

Вы можете вызвать "setButtons(Form f)" из любого места, но вы должны отправить в качестве параметра правильную форму. В этом-то все и дело. В моем примере я посылаю "это" из конструктора формы, так что это наверняка будет правильный объект.

akosisugar

да, я действительно понимаю событие..

извините, извините ... теперь он работает..

________________

Все в порядке. В C++ это был указатель на функцию, простое 32-битное целое число (адрес в памяти), в .NET он почти такой же, но лучше защищен(по имени и параметрам).
Таким образом, событие в классе-это коллекция (может быть нулевой, если она пуста) "указателей на функцию".

akosisugar

еще раз спасибо, сэр!

Рейтинг:
0

RickZeeland

Вам нужно использовать элементы управления InvokeRequired собственность, см.:
Как сделать Потокобезопасные вызовы элементов управления Windows Forms | Microsoft Docs[^]