Делегаты, обработчик событий и элементы управления.OfType

#c# #winforms #forms

#c# #winforms #формы

Вопрос:

у меня есть 2 вопроса об этом коде.
1-й:
В чем разница между 1-м и 2-м способами в коде? я имею в виду, что синтаксис не то, что они делают. какой из них предпочтительнее?
2-й: в элементах управления.OfType как мы можем получить множественный результат, например, для текстового поля и кнопки, здесь я написал только для текстового поля.(Форма Windows)

 private void Form2_Load(object sender, EventArgs e)
{
    foreach (Control item in Controls.OfType<TextBox>())
    {
        item.MouseEnter  = item_MouseEnter; // 1st way 
        item.MouseLeave  = new System.EventHandler(item_MouseLeave); //2nd way
    }
}
void item_MouseLeave(object sender, EventArgs e)
{
    var senderButton = (Control)sender;
    senderButton.Height -= 5;
    senderButton.Width -= 5;
}

void item_MouseEnter(object sender, EventArgs e)
{
    var senderButton = (Control)sender;
    senderButton.Height  = 5;
    senderButton.Width  = 5;
}
  

Ответ №1:

1-й: разницы нет. Первая строка будет неявно использовать EventHandler . Это предпочтительнее.

2nd: OfType принимает только 1 аргумент типа, поэтому он будет возвращать только объекты этого типа. Но вы можете выполнить фильтрацию самостоятельно. Controls.Where(ctrl => ctrl is TextBox || ctrl is Button) (Это то, что OfType делает внутри в любом случае.)

Редактировать: похоже, что ControlCollection реализует неродовой IEnumerable, поэтому у него нет метода расширения, который называется Where . Поэтому вы должны использовать:

Controls.OfType<Control>().Where(ctrl => ctrl is TextBox || ctrl is Button)

(OfType преобразует IEnumerable to IEnumerable<Control> )

Или вы могли бы использовать простой оператор if внутри цикла.

Комментарии:

1. я не могу его написать, он выдает мне ошибку, он не распознает, где, не могли бы вы написать код?

2. еще одна ошибка для OfType<Control>, недопустима в данном контексте, напишите ее в цикле foreach, пожалуйста, tnx заранее.

3. Я пропустил круглые скобки, в этом была проблема? Это должно быть OfType<Control>()