我的自定义 WinForms 控件有一个属性,用于选择表单上的另一个控件。这是此类属性的简化示例:
private TextBox _targetControl;
public TextBox TargetControl
{
get {return _targetControl;}
set {_targetControl = value;}
}
如果我在自定义控件的 TargetControl 属性中选择了一个 TextBox 控件,然后从窗体中删除了所选的 TextBox 控件,则属性网格中的 TargetControl 属性的值将按预期变为空。但我仍然可以点击属性名称前面的加号按钮,看到被删除的控件的属性:
有没有办法在删除所选控件后更新属性网格以删除该加号按钮?
附注这个问题与我的上一个问题有关,当从表单中删除另一个控件中引用的控件时收到通知。我知道如何在删除控件时接收通知,但不知道之后如何更新属性网格。
关于上一个问题:
当从表单中删除另一个控件中引用的控件时,获取设计时通知
IComponentChangeService 接口允许在添加/删除/重命名或更改组件(任何组件/控件)时接收设计时通知。组件可以是表单本身的子级或任何其他子容器)。
由于我们在设计时分配了对另一个组件的属性的组件引用 - 因此它显示在 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;
}