我有一个自定义控件,其属性允许在表单上选择特定类型的另一个控件。为简单起见,将其设为 TextBox 控件。
我的自定义控件的属性如下所示:
private TextBox _targetControl;
public TextBox TargetControl
{
get {return _targetControl;}
set {_targetControl = value;}
}
当在设计时从表单中删除选定的目标控件时,有没有办法在我的自定义控件中获取通知?请注意,目标控件可以位于诸如 Panel 之类的容器中(即,它不是表单的 Controls 集合的项目)。
最佳答案
要在设计时添加、删除、重命名或以其他方式更改组件时接收通知,您可以调用 [Component].GetService()初始化 IComponentChangeService 的方法在当前网站上。
此接口(interface)允许订阅事件,如 IComponentChangeService.ComponentRemoved ,当表单设计器中的组件发生某些情况时引发。
例如,当定位此 UserControl 时,它会订阅 ComponentRemoved
和 ComponentRemoving
事件,以验证该事件是否与 引用的 Control 相关>TargetControl
属性:
public partial class UCComponentsChange : UserControl {
private IComponentChangeService componentChangeService;
public UCComponentsChange() =>InitializeComponent();
private TextBox _targetControl = null;
public TextBox TargetControl {
get => _targetControl;
set => _targetControl = value;
}
public override ISite Site {
get => base.Site;
set {
base.Site = value;
RegisterComponentsChangeNotifications();
}
}
private void RegisterComponentsChangeNotifications() {
if (componentChangeService != null) {
componentChangeService.ComponentRemoving -= NotifyComponentRemoving;
componentChangeService.ComponentRemoved -= NotifyComponentRemoved;
}
componentChangeService = GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (componentChangeService != null) {
componentChangeService.ComponentRemoving += NotifyComponentRemoving;
componentChangeService.ComponentRemoved += NotifyComponentRemoved;
}
}
private void NotifyComponentRemoving(object sender, ComponentEventArgs e) {
if (IsTargetControlAffected(e.Component)) {
// Our Control is being removed
}
}
private void NotifyComponentRemoved(object sender, ComponentEventArgs e) {
if (IsTargetControlAffected(e.Component)) {
// Our Control has been removed. Set the reference to null
TargetControl = null;
}
}
private bool IsTargetControlAffected(IComponent component) =>
_targetControl != null && _targetControl == component;
}
关于.net - 当从表单中删除另一个控件中引用的控件时,获取设计时通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77314708/