Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用{}将事件添加到动态生成的控件中_C#_Winforms - Fatal编程技术网

C# 无法使用{}将事件添加到动态生成的控件中

C# 无法使用{}将事件添加到动态生成的控件中,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

我一直在研究在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),
    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-当然,没有问题。请记住,这种方法允许您根据需要附加尽可能多的处理程序,因此,在添加到父集合之前,可以针对按钮运行任何代码。