C# 如何在构造函数中包含Visual Studio在设计时不会执行的代码?

C# 如何在构造函数中包含Visual Studio在设计时不会执行的代码?,c#,visual-studio,design-time,C#,Visual Studio,Design Time,我在用户控件的构造函数中调用了一个方法,该方法在设计时无法工作(连接到数据库),当我试图将该控件添加到GUI设计器中时,Visual Studio刚刚退出 当然,我可以将代码分解成一个单独的方法,但我不喜欢这样的想法,即每次使用该对象时,我都需要记住执行对该对象的功能至关重要的某个方法(这就是构造函数的作用!) 是否有类似预处理器的符号,我可以用它来标记代码,这样Visual Studio就不会在设计时尝试执行该代码?在Windows窗体中 if (!DesignMode) { // c

我在用户控件的构造函数中调用了一个方法,该方法在设计时无法工作(连接到数据库),当我试图将该控件添加到GUI设计器中时,Visual Studio刚刚退出 当然,我可以将代码分解成一个单独的方法,但我不喜欢这样的想法,即每次使用该对象时,我都需要记住执行对该对象的功能至关重要的某个方法(这就是构造函数的作用!)

是否有类似预处理器的符号,我可以用它来标记代码,这样Visual Studio就不会在设计时尝试执行该代码?

在Windows窗体中

if (!DesignMode)
{
    // code that shouldn't be executed at design time
}
正如其他人提到的,这在构造函数中不起作用。它通常用于
Form.Load
事件中

看看这个


如其他人所述,您可以使用
组件的属性。但是,您将无法在控件的构造函数中执行此操作。构造函数和构造函数调用的方法中的
DesignMode
属性始终为
false
。要解决此问题,请在
OnLoad()
回调中重新计算代码以连接到数据库。
DesignMode
属性在该点有效。有关推理,请参阅(请参阅本文的DesignMode部分)


我刚刚遇到了这个描述如何使用
System.ComponentModel.LicenseManager.UsageMode
属性来做同样的事情的例子。该博客描述了
DesignMode
属性在处理嵌套控件时的另一个缺点。显然,
UsageMode
属性没有相同的缺点,可以在构造函数中使用。我个人无法担保,但可能值得研究。

我喜欢Michael Petrotta的Windows窗体方法。如果有人想对WPF应用相同的技术,只需使用
IsInDesignMode

例如:

public SomeViewModel()
{
    if (!IsInDesignMode)
    {
        DoWork();
    }
}

如果您使用的是您试图使用的实际UI,请参阅上面的代码。在控件上有类似这样的内容的情况下,当您切换回该控件的设计器时,一切正常,并且没有设计时错误。现在,如果通过从工具箱中拖动包含上述代码的控件,将其添加到其他窗体或其他控件中,它将显示一些设计时错误。

这是一个好的设计吗?依我看,在构造函数中不应该做太多的工作(在您的情况下,连接到数据库)。我很想看看专家们都说了些什么。太棒了,完全相同的时间(X-)快速而准确地说到点子上!我期待一些预处理器符号,因为这不会影响编译后的程序,但是这个小检查的影响当然是最小的;)请小心!DesingMode属性有一些需要考虑的问题。你可以在这里找到一篇文章:是的,我很快就意识到了这一点。我标记为“答案”的答案仍然有效。对此我深表歉意;我可以发誓我在构造器中使用过它。你链接的博客帖子对我来说非常适合!(至少到目前为止)很高兴知道。下次需要自定义控件时,我可能会利用这种技术。Blog现在已经过时了,但基本上它只是:
if(System.ComponentModel.LicenseManager.UsageMode==System.ComponentModel.LicenseUsageMode.Designtime)
public SomeViewModel()
{
    if (!IsInDesignMode)
    {
        DoWork();
    }
}