从表单中删除另一个控件中引用的控件时更新 Visual Studio 属性网格

问题描述 投票:0回答:1

我的自定义 WinForms 控件有一个属性,用于选择表单上的另一个控件。这是此类属性的简化示例:

private TextBox _targetControl;

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

如果我在自定义控件的 TargetControl 属性中选择了一个 TextBox 控件,然后从窗体中删除了所选的 TextBox 控件,则属性网格中的 TargetControl 属性的值将按预期变为空。但我仍然可以点击属性名称前面的加号按钮,看到被删除的控件的属性:

有没有办法在删除所选控件后更新属性网格以删除该加号按钮?

附注这个问题与我的上一个问题有关,当从表单中删除另一个控件中引用的控件时收到通知。我知道如何在删除控件时接收通知,但不知道之后如何更新属性网格。

.net winforms controls design-time
1个回答
0
投票

关于上一个问题:
当从表单中删除另一个控件中引用的控件时,获取设计时通知

IComponentChangeService 接口允许在添加/删除/重命名或更改组件(任何组件/控件)时接收设计时通知。组件可以是表单本身的子级或任何其他子容器)。

由于我们在设计时分配了对另一个组件的属性的组件引用 - 因此它显示在 PropertyGrid 中 - 我们还缓存了对象的属性。

当组件从表单中删除(例如删除)时,缓存的元素仍然存在。

要刷新 PropertyGrid 中的视图,只需将引用现已删除的组件的属性设置为

null

 即可。
这会导致 PropertyGrid 再次读取属性值(全部)并重置视图。

public partial class UCComponentsChange : UserControl { private IComponentChangeService componentChangeService; private Control _targetControl = null; public Control TargetControl { get => _targetControl; set => _targetControl = value; } public override ISite Site { get => base.Site; set { base.Site = value; RegisterComponentsChangeNotifications(); } } private void RegisterComponentsChangeNotifications() { // [...] componentChangeService = GetService( typeof(IComponentChangeService)) as IComponentChangeService; if (componentChangeService != null) { // [...] } } 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; }
    
© www.soinside.com 2019 - 2024. All rights reserved.