You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除窗体中被引用控件后,如何更新VS属性网格移除加号按钮?

解决这个问题的核心是让属性网格及时感知到TargetControl属性的状态变化,并且强制刷新它的显示逻辑,具体可以按这几步来做:

  1. 让自定义控件实现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;
        }
    }
}
  1. 关键逻辑说明
  • 实现INotifyPropertyChanged后,属性网格会监听属性变更事件,当TargetControl变为null时,会自动更新显示文本。
  • 订阅目标控件的Disposed事件,能准确捕获它被移除销毁的时机,及时将TargetControl设为null。
  • 强制刷新属性网格的步骤是为了应对设计器中可能存在的刷新延迟,确保加号按钮被移除——因为当属性值为null时,属性网格不会显示展开按钮。

如果是在运行时使用控件,只要触发PropertyChanged事件通常就够了;如果是设计器场景,加上强制刷新的逻辑能彻底解决加号残留的问题。

内容的提问来源于stack exchange,提问作者Tecman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:28:09