Winform自定义控件为什么“对象引用未设置为对象的实例”?

use*_*291 1 c# winforms

我创建了一个具有最大值的自定义控件。当添加if(DesignMode)Parent.Refresh();时 它可以编译,但是在客户端中它会因消息错误而崩溃:

你调用的对象是空的

调用堆栈:

at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
at Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkPropertyDescriptor.SetValue(Object component, Object value)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement, CodePropertyReferenceExpression propertyReferenceEx, Boolean reportError)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement) 
Run Code Online (Sandbox Code Playgroud)

源代码:

[Category("Main")]
[Description("Max Value")]
[DefaultValue(100)]
public int Max
{
    get { return _max; }
    set { 
        _max = value;
        if (DesignMode)
        {
            Parent.Refresh();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bot*_*000 5

尝试这个:

if (DesignMode && Parent != null)
{
    Parent.Refresh();
}
Run Code Online (Sandbox Code Playgroud)

首次设置该值时,控件很可能尚未添加到其父级。

如果查看窗体的* .designer.cs,您会注意到在将usercontrol的属性添加到父窗体之前已对其进行了分配。这就是为什么您会得到例外。