[英]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.