移除窗体中被引用控件后,如何更新VS属性网格移除加号按钮?
解决这个问题的核心是让属性网格及时感知到TargetControl属性的状态变化,并且强制刷新它的显示逻辑,具体可以按这几步来做:
- 让自定义控件实现
INotifyPropertyChanged接口,确保属性值变化时能通知属性网格
给你的自定义控件加上属性变更通知机制,这样当TargetControl被设为null时,属性网格能自动收到更新信号。代码示例如下:
using System.ComponentModel; using System.Windows.Forms; public class YourCustomControl : Control, INotifyPropertyChanged { private TextBox _targetControl; // 实现INotifyPropertyChanged接口的事件 public event PropertyChangedEventHandler PropertyChanged; public TextBox TargetControl { get => _targetControl; set { if (_targetControl == value) return; // 先取消之前订阅的控件销毁事件(如果有的话) if (_targetControl != null) { _targetControl.Disposed -= OnTargetControlDisposed; } _targetControl = value; // 订阅新目标控件的销毁事件,用于感知它被移除/销毁 if (_targetControl != null) { _targetControl.Disposed += OnTargetControlDisposed; } // 触发属性变更通知 NotifyPropertyChanged(nameof(TargetControl)); } } private void OnTargetControlDisposed(object sender, EventArgs e) { // 当目标控件被销毁时,将属性设为null TargetControl = null; // 强制刷新属性网格(如果能拿到实例的话) RefreshDesignerPropertyGrid(); } private void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private void RefreshDesignerPropertyGrid() { // 在设计器中查找当前窗体的PropertyGrid并刷新 var form = FindForm(); if (form == null) return; var propertyGrid = form.Controls.OfType<PropertyGrid>().FirstOrDefault(); if (propertyGrid != null && propertyGrid.SelectedObject == this) { // 通过先清空再重新绑定选中对象,强制刷新显示 propertyGrid.SelectedObject = null; propertyGrid.SelectedObject = this; } } }
- 关键逻辑说明
- 实现
INotifyPropertyChanged后,属性网格会监听属性变更事件,当TargetControl变为null时,会自动更新显示文本。 - 订阅目标控件的
Disposed事件,能准确捕获它被移除销毁的时机,及时将TargetControl设为null。 - 强制刷新属性网格的步骤是为了应对设计器中可能存在的刷新延迟,确保加号按钮被移除——因为当属性值为null时,属性网格不会显示展开按钮。
如果是在运行时使用控件,只要触发PropertyChanged事件通常就够了;如果是设计器场景,加上强制刷新的逻辑能彻底解决加号残留的问题。
内容的提问来源于stack exchange,提问作者Tecman
相关产品推荐
相关产品推荐

