C# 委托、事件处理程序和控件。OfType
关于此代码,我有两个问题。C# 委托、事件处理程序和控件。OfType,c#,winforms,forms,C#,Winforms,Forms,关于此代码,我有两个问题。 第一名: 代码中的1st方式和2nd方式有什么区别?我的意思是,他们做什么都没有。您更喜欢哪一个? 第二名: 在类型为的控件中,我们如何获得多个结果,例如文本框和按钮,这里我仅为文本框编写。(Windows窗体) private void Form2\u加载(对象发送方,事件参数e) { foreach(Controls.OfType()中的控件项) { item.MouseEnter+=item_MouseEnter;//第1路 item.MouseLeave+=n
第一名:
代码中的1st方式和2nd方式有什么区别?我的意思是,他们做什么都没有。您更喜欢哪一个?
第二名: 在类型为的控件中,我们如何获得多个结果,例如文本框和按钮,这里我仅为文本框编写。(Windows窗体)
private void Form2\u加载(对象发送方,事件参数e)
{
foreach(Controls.OfType()中的控件项)
{
item.MouseEnter+=item_MouseEnter;//第1路
item.MouseLeave+=new System.EventHandler(item_MouseLeave);//第二种方式
}
}
无效项_MouseLeave(对象发送方,事件参数e)
{
变量senderButton=(控制)发送器;
senderButton.高度-=5;
senderButton.宽度-=5;
}
无效项\u鼠标指针(对象发送方,事件参数e)
{
变量senderButton=(控制)发送器;
senderButton.高度+=5;
senderButton.宽度+=5;
}
1st:没有区别。第一行将隐式使用EventHandler。这是首选
2nd:of type只接受1个类型参数,因此它将只返回该类型的对象。但是你可以自己过滤<代码>控件。其中(ctrl=>ctrl是文本框| | ctrl是按钮)
(无论如何,这就是OfType内部所做的。)
编辑:ControlCollection似乎实现了非泛型IEnumerable,因此它没有名为Where的扩展方法。
因此,您必须使用:
Controls.OfType()。其中(ctrl=>ctrl是文本框| | ctrl是按钮)
(OfType将IEnumerable转换为IEnumerable
)
或者你可以在循环中使用一个简单的if语句。我写不出来,它会出错,它不知道在哪里,你介意写代码吗?OfType的另一个错误,在给定的上下文中无效,请提前在foreach循环中写它,tnx。我错过了括号,这是问题吗?它应该是()类型
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;
}