2009-02-03 49 views
2

我已经子类化树视图,并在实例化它加载一个新的ImageList(和相关的图像)。.Net C#设计查看错误

每当我切换到设计器视图时,它也试图运行此代码,但图像不在设计器的路径中,因此它崩溃。我结束了一个黑客攻击,看看当前目录是否是“Visual Studio”,然后什么都不做......但是这太难看了。

我发现这发生在其他事情上。如果一个控件在加载/初始化过程中试图使用对象,而这些对象只有在程序运行时才可用,那么设计视图不能调出控件。

但是有没有办法解决这个问题?我猜我想要的是为设计器(仅)设置try/catch并忽略我知道会发生的一些错误(如FileNotFoundException等)的能力。从System.Windows.Forms.Control继承

感谢

回答

4

一切有DesignMode属性,返回一个布尔值,表示如果你是在设计模式或没有。您可以使用它来确定何时/何时不加载外部资源。

1

通常最好将这些资源的加载转移到OnLoad,因为它们很少直接在构建时需要。这解决了您所看到的问题,并且意味着只有至少显示一次的树才会执行这些额外的资源加载步骤。

否则,您可以在设计时通过检查DesignMode属性并相应地采取措施排除这些步骤。

1

感谢您指出我在正确的directioon球员。

我曾尝试注册OnLoad事件,但是当设计视图出现时触发该事件,所以对我来说这并没有什么效果(我做错了什么?)。

无论如何,我多看了一下DesignMode属性。它只能用于控件,有时你的对象可能不是控件。

因此,这里是我喜欢的答案:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) { 
    // design-time stuff 
} else { 
    // run-time stuff 
} 

发现here

1

这是一个很好的模式,如果您使用设计器中显示的图像样本制作控件库或挂钩到其他设计器功能但是作为开发模式我不确定它是否非常有效。

我建议将你的“业务逻辑”(在这种情况下,你的某些图像加载到树视图中)在你的树视图控件的边界之外。在你的情况我会放在逻辑形式的Load事件中,控制里面:

public void Load(object sender, EventArgs e) 
{ 
    string path = "c:\somePath\toAwesome\Images"; 
    myFunkyTreeView.AddImages(path); 
} 

对于较大的应用程序,我个人认为要在逻辑移位连出的形式本身,但是这是因为它需要额外的管道设施作为这种灵活性的平衡。

+0

+1:子类化WinForms控件以执行特定于业务的视图逻辑始终以无法维护的灾难结束。呸。 – 2009-02-03 22:31:48