繁体   English   中英

无法使用{}向动态生成的控件添加事件

[英]Unable to Add Event to Dynamically Generated Control using {}

我一直在研究在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
}

问题

有没有办法向通过方法A生成的按钮添加事件处理程序?

这是一种使用方便的扩展方法来实现它的方法:

public static class Ex
{
    public static T Attach<T>(this T sender, Action<T> addHandler)
    {
        addHandler(sender);
        return sender;
    }
}

然后你可以这样写你的代码:

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!");
}

当我运行它时写出Clicked! 到控制台。

您可以链接Attach调用以Attach多个事件。

现在,您可以轻松地将其包装在Container.Controls.Add(...)调用中。

你可以这样做:

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;

或者如果你需要局部变量:

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;

您可以创建一个扩展方法来返回添加的控件:

// Case A
public static Control AddAndReturn(this ControlCollection controls, Control control)
{
    controls.Add(control);
    return control;
}

// Case B
public static Control Add(this ControlCollection controls, Control control, bool returnControl)
{
    controls.Add(control);
    if (returnControl)
        return control;
    return null;
}

你可以随意使用它:

// Case A
Container.Controls.AddAndReturn(new Button
{
    Name = "Button Name",
    Text = "Button Text",
    Size = new Size(69, 69),
    Location = new Point(420, 420)
}).Click += DesignerButton_OnClick;

// Case B
Container.Controls.Add(new Button
{
    Name = "Button Name",
    Text = "Button Text",
    Size = new Size(69, 69),
    Location = new Point(420, 420)
}, returnControl: true).Click += DesignerButton_OnClick;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM