委托,事件处理程序和控件

本文关键字:控件 程序 事件处理 委托 | 更新日期: 2023-09-27 18:09:58

关于这段代码我有两个问题。
1:
代码中第一种方式和第二种方式的区别是什么?我指的是语法,而不是他们做什么。你更喜欢哪一个?
二:控件。OfType我们如何获得多个结果,例如TextBox按钮,这里我只写了TextBox。(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;
}

委托,事件处理程序和控件

1st:没有区别。第一行将隐式地使用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语句