.net - 当从表单中删除另一个控件中引用的控件时,获取设计时通知

标签 .net winforms controls design-time

我有一个自定义控件,其属性允许在表单上选择特定类型的另一个控件。为简单起见,将其设为 TextBox 控件。

我的自定义控件的属性如下所示:

private TextBox _targetControl;

public TextBox TargetControl
{
    get {return _targetControl;}
    set {_targetControl = value;}
}

当在设计时从表单中删除选定的目标控件时,有没有办法在我的自定义控件中获取通知?请注意,目标控件可以位于诸如 Panel 之类的容器中(即,它不是表单的 Controls 集合的项目)。

最佳答案

要在设计时添加、删除、重命名或以其他方式更改组件时接收通知,您可以调用 [Component].GetService()初始化 IComponentChangeService 的方法在当前网站上。

此接口(interface)允许订阅事件,如 IComponentChangeService.ComponentRemoved ,当表单设计器中的组件发生某些情况时引发。

例如,当定位此 UserControl 时,它会订阅 ComponentRemovedComponentRemoving 事件,以验证该事件是否与 引用的 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/

相关文章:

jquery - 更改库 graphdracula 中的字体大小

c# - PushButtonState.Default 和 PushButtonState.Normal 之间的逻辑区别是什么?

.net - NHibernate 数据访问而不卡住 GUI

c++ - 我必须在 VS 2008 中使用 "Visual"C++ 吗?

C# - 将值分配给控制思维循环

c# - 在商业应用中使用 Fluent NHibernate

.net - 为什么 .NET 中没有 XML 可序列化字典?

WPF:是否有内置的 TreeGrid/TreeListView?

html - 无法禁用我的嵌入视频的控件?

c# - 带有单元测试的示例项目