簡而言之,我的應用程式以編程方式將復選框添加到名為“fp”的 flowlayoutpanel 中。
fp.Controls.Add(new CheckBox() { Name = "cb1", Text = "New Checkbox", Checked = true, AutoSize = true, AllowDrop = true });
我一直在嘗試在那個新的 Checkbox 實體中添加一個 mouseclick 事件。我嘗試將下面的行添加到上面的代碼中。
this.MouseDown = new MouseEventHandler(cbox_MouseDown);
但是我得到了無效的初始化成員宣告符
我也嘗試添加這個:
((CheckBox)(this.Controls.Find("cb1", false))[0]).MouseDown = new MouseEventHandler(cbox_MouseDown);
在添加新的復選框實體之前,但它也不起作用。
我非常欣賞一種將事件直接插入新 CheckBox() 實體的方法。
謝謝各位<3
uj5u.com熱心網友回復:
- C# 的 Object-Initializer 語法不支持 events。
- C# 的 Object-Initializers 也有很多其他的缺點,我不是它們的粉絲(可怕的除錯,堆疊跟蹤中的斷行號,
IDisposable拋出例外時它會忽略,你不能將它與現有的物件,通常比其他情況占用更多的代碼行,等等)。
- C# 的 Object-Initializers 也有很多其他的缺點,我不是它們的粉絲(可怕的除錯,堆疊跟蹤中的斷行號,
- 但是,您可以定義一個新的擴展方法,
ControlsCollection為您添加事件處理程式。
像這樣:
MyExtensions.cs:
public static class MyExtensions
{
public static void AddWithClickHandler( this ControlsCollection ctrls, EventHandler onClickHandler, CheckBox newCheckBox )
{
newCheckBox.Click = onClickHandler;
ctrls.Add( newCheckBox );
}
}
MyForm.cs:
public partial class MyForm : Form
{
private readonly EventHandler onClickHandler;
public MyForm()
{
this.InitializeComponent();
//
this.onClickHandler = new EventHandler( this.cbox_MouseDown );
}
private void cbox_MouseDown( Object sender, EventArgs e )
{
//
}
private Int32 checkboxCount = 0;
private String GetNewCheckboxName()
{
this.checkboxCount = 1;
return "cb" this.checkboxCount.ToString("d");
}
public void AddCheckboxes()
{
this.fp.Controls.AddWithClickHandler( onClickHandler, new CheckBox() { Name = this.GetNewCheckboxName(), Text = "New Checkbox", Checked = true, AutoSize = true, AllowDrop = true } );
this.fp.Controls.AddWithClickHandler( onClickHandler, new CheckBox() { Name = this.GetNewCheckboxName(), Text = "New Checkbox", Checked = true, AutoSize = true, AllowDrop = true } );
this.fp.Controls.AddWithClickHandler( onClickHandler, new CheckBox() { Name = this.GetNewCheckboxName(), Text = "New Checkbox", Checked = true, AutoSize = true, AllowDrop = true } );
}
}
注意:
- 在我的代碼中,
MyForm該類只創建一個EventHandler實體(使用new EventHandler),這很重要,因為您需要允許代碼取消注冊(即洗掉)事件處理程式以防止記憶體泄漏。- 不幸的是,您不能洗掉使用這樣的速記語法注冊的事件處理程式:
obj.Click = this.OnClickMethod; - 您也不能洗掉作為 lambda 方法實作的事件處理程式,例如
obj.Click = ( obj, sender ) => this.DoSomething();
- 不幸的是,您不能洗掉使用這樣的速記語法注冊的事件處理程式:
- Control Names 需要是唯一的,所以不是像
"cb1"and這樣的硬編碼字串"cb2",每個復選框的唯一名稱是由GetNewCheckboxName()方法生成的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367625.html
標籤:C#
