C# 无法使用{}将事件添加到动态生成的控件中
我一直在研究在C#中向另一个父控件添加控件的方法, 我知道有一系列方法可以实现这一点,简单的做法是遵循这些方法——然而,我很好奇,使用下面的方法无法做到这一点: 方法AC# 无法使用{}将事件添加到动态生成的控件中,c#,winforms,C#,Winforms,我一直在研究在C#中向另一个父控件添加控件的方法, 我知道有一系列方法可以实现这一点,简单的做法是遵循这些方法——然而,我很好奇,使用下面的方法无法做到这一点: 方法A Container.Controls.Add(new Button //Add the control straight to the parent { Name = "Button Name", Text = "Button Text", Size = new Size(69, 69), Loc
Container.Controls.Add(new Button //Add the control straight to the parent
{
Name = "Button Name",
Text = "Button Text",
Size = new Size(69, 69),
Location = new Point(420, 420)
}.Click += DesignerButton_OnClick); //This is the only method Intellisense recognised, even though it does not work...
与有效的方法相比:
方法B
Button NewButton = new Button();
NewButton.Name = "Button Name";
NewButton.Text = "Button Text";
NewButton.Size = new Size(69, 69);
NewButton.Location = new Point(420, 420);
NewButton.Click += DesignerButton_OnClick; //Add the handler
Container.Controls.Add(NewButton); //Add control to parent
我非常怀疑这是我调用的函数的问题,但是为了解决这里的问题,它是简单明了的:
处理功能
private static void DesignerButton_OnClick(object Sender, EventArgs Ev)
{
//Do stuff
}
问题
private static void DesignerButton_OnClick(object Sender, EventArgs Ev)
{
//Do stuff
}
有没有办法向通过方法a生成的按钮添加事件处理程序 您可以创建一个扩展方法来返回添加的控件:
//案例A
公共静态控件AddAndReturn(此控件集合控件,控件控件)
{
控件。添加(控件);
返回控制;
}
//案例B
公共静态控件添加(此控件集合控件、控件控件、布尔返回控件)
{
控件。添加(控件);
如果(返回控制)
返回控制;
返回null;
}
您可以根据需要使用它:
//案例A
Container.Controls.AddAndReturn(新建按钮
{
Name=“按钮名称”,
Text=“按钮文本”,
尺寸=新尺寸(69,69),
位置=新点(420420)
})。单击+=设计器按钮单击;
//案例B
Container.Controls.Add(新建按钮
{
Name=“按钮名称”,
Text=“按钮文本”,
尺寸=新尺寸(69,69),
位置=新点(420420)
},returnControl:true)。单击+=DesignerButton\u OnClick;
您可以这样做:
new Button
{
Parent = Container, // the same as Container.Controls.Add
Name = "Button Name",
Text = "Button Text",
Size = new Size(69, 69),
Location = new Point(420, 420)
}.Click += DesignerButton_OnClick;
void Main()
{
var btn = new Button()
{
Name = "Button Name",
Text = "Button Text",
Size = new Size(69, 69),
Location = new Point(420, 420)
}.Attach(b => b.Click += DesignerButton_OnClick);
btn.PerformClick();
}
private static void DesignerButton_OnClick(object Sender, EventArgs Ev)
{
Console.WriteLine("Clicked!");
}
或者,如果需要局部变量:
var NewButton = new Button
{
Parent = Container,
Name = "Button Name",
Text = "Button Text",
Size = new Size(69, 69),
Location = new Point(420, 420)
};
NewButton.Click += DesignerButton_OnClick;
下面是一种使用方便的扩展方法进行扩展的方法:
public static class Ex
{
public static T Attach<T>(this T sender, Action<T> addHandler)
{
addHandler(sender);
return sender;
}
}
当我运行时,它会写出点击代码>到控制台
您可以链接Attach
调用以连接多个事件
现在,您可以轻松地将其包装到容器中。Controls.Add(…)
调用。不,没有。方法A仅用于设置字段和属性。我想这回答了我最近几个月偶尔感到疑惑的问题,但我很懒,并且使用方法B。我怀疑使用方法A的理由是否很多,只是看起来是一种节省时间的方式(几乎没有)-我也没有看到多少性能优势,不过,为了便于维护,眼睛会稍微容易一点。详细说明某些东西不起作用的原因很有用。我猜你的意思是“不编译”。您的代码基本上相当于Container.Controls.Add(btn.Click+=handler)。您不是将按钮添加到集合中,而是添加事件+=操作返回的任何结果(看起来是“void”)。并非所有东西都使用流畅的界面另一行:Container.Controls.Last()。单击+=DesignerButton\u OnClick代码>或容器.Controls.首先(control=>control.Name==“按钮名”)。单击+=DesignerButton\u OnClick代码>中有一个向对象初始值设定项添加事件订阅的请求。非常好的方法,可能是所有方法中最简单的方法,并使用最佳代码完成工作。我非常喜欢这个方法,但是,对于我的实现,我正在寻找像@Alexander Petrov answer这样简单的方法。@Hex-当然,没有问题。请记住,这种方法允许您根据需要附加尽可能多的处理程序,因此,在添加到父集合之前,可以针对按钮运行任何代码。