C# 在设计器中访问UserControl构造函数中的静态数据存在错误

C# 在设计器中访问UserControl构造函数中的静态数据存在错误,c#,winforms,user-controls,C#,Winforms,User Controls,我需要在加载UserControl时访问外部数据(在构造函数或加载事件中) 它在运行模式下工作正常,但在VS Designer模式下会引发NullReferenceException,因为在实例中静态数据未实例化 public partial class MyControl : UserControl { public MyControl() { InitializeComponent(); // Problem when accessing e

我需要在加载UserControl时访问外部数据(在构造函数或加载事件中)

它在运行模式下工作正常,但在VS Designer模式下会引发NullReferenceException,因为在实例中静态数据未实例化

public partial class MyControl : UserControl
{
    public MyControl()
    {
        InitializeComponent();

        // Problem when accessing external data
        Foo( AnotherClass.MyStaticData );
    }

    private void Foo(Data d)
    {
        //...
    }
}

如何执行行
Foo(AnotherClass.mystaticata)来自控件?

在自定义控件中,您可以检查它们是否处于设计模式,以及行为是否不同。例如,可以提供默认值,而不是缺少的静态类属性,以便设计器可以呈现设计时间控件

在本页中,您有很多关于此的信息:


属性是。

我回答自己,这是解决方案:

使用
ISite.DesignMode
显然无法在UserControl环境下工作,因此我在这里找到了一个可靠的解决方案:


显然,不可能访问设计器中的实际静态数据。因此,唯一的解决方案是在设计时提供假人。结合56ka和JotaBe的答案,以下是解决问题的方法:

public partial class MyControl : UserControl
{
    public MyControl()
    {
        InitializeComponent();
      
        if(LicenseManager.UsageMode == LicenseUsageMode.Designtime)
        {// Use a dummy value for display at design time.
            Foo(desginDummyValue); 
        }
        else
        {// Use the real static data only at runtime
            Foo( AnotherClass.MyStaticData ); 
        }
    }
}

CtrlsSymbolsGrid.cs所做的看起来不像是错误所在。错误出现在
CtrlSymbolsGrid\u Load
@K.B它没有真正的重要性,这个问题是在我更改访问静态数据的方式时发生的。@johns如果你说得对,当我试图在Load EventConvertification中移动该行时,屏幕显示:
设计模式
在控件以其他形式使用时没有帮助,你有什么想法吗?对这个问题作更深入的解释。我不明白“以其他形式使用控件”是什么意思。我将它用于WebForms,而不是WinForms,在其他控件中嵌套控件时没有任何问题。我的意思是将
UserControl
用作其他
表单中的.NET组件。UserForm的构造函数使调用表单抛出异常请编辑您的问题,对您的操作给出更详细的解释:用户控件的完整代码,以及如何抛出异常。如果我能理解并复制它,也许我能给你更多的提示。谢谢你JotaBe,你为我铺路,现在我找到了最终的解决方案,我在原始帖子中写道:)
public partial class MyControl : UserControl
{
    public MyControl()
    {
        InitializeComponent();
      
        if(LicenseManager.UsageMode == LicenseUsageMode.Designtime)
        {// Use a dummy value for display at design time.
            Foo(desginDummyValue); 
        }
        else
        {// Use the real static data only at runtime
            Foo( AnotherClass.MyStaticData ); 
        }
    }
}