假设我在ASP.NET中有一个包含按钮的用户控件:
public class MyUserControl : UserControl {
private Button btnSave = new Button();
}
Run Code Online (Sandbox Code Playgroud)
我可以通过创建指向按钮的属性将按钮的任何属性暴露给外部:
public string SaveButtonText {
get { return btnSave.Text; }
set { btnSave.Text = value; }
}
Run Code Online (Sandbox Code Playgroud)
那么我可以这样设置按钮的文本:
MyControl.SaveButtonText = "hello world";
Run Code Online (Sandbox Code Playgroud)
是否有类似的构造我可以用来将按钮的事件暴露给外部?就像是:
public event SaveButtonClick { return btnSave.OnClick; }
...
MyControl.SaveButtonClick += new EventHandler(...);
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 26
你可以这样做,是的:
public event EventHandler SaveButtonClick
{
add { btnSave.Click += value; }
remove { btnSave.Click -= value; }
}
Run Code Online (Sandbox Code Playgroud)
但请注意,这有一个缺点 - 提供给事件处理程序的"sender"参数仍然是保存按钮而不是您的控件......这可能不是订阅者所期望的.另一种方法是自己订阅一次保存按钮的点击处理程序:
public event EventHandler SaveButtonClick = delegate {};
private void OnSaveButtonClicked(object sender, EventArgs e)
{
// Replace the original sender with "this"
SaveButtonClick(this, e);
}
...
btnSave.Click += OnSaveButtonClicked();
Run Code Online (Sandbox Code Playgroud)
这种方法也有一个缺点......你最终会从保存按钮到"this"的引用,这可能会对垃圾收集产生影响.基本上,在保存按钮也有资格进行垃圾回收之前,您的控件将无法进行垃圾回收.在这种情况下,我非常怀疑这是一个问题,但值得注意.
public event EventHandler SaveButtonClick {
add { btnSave.Click += new EventHandler (value); }
remove { btnSave.Click-= new EventHandler (value); }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2143 次 |
| 最近记录: |