#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>()