首页 > 代码库 > 【问题待解决】自定义控件设计界面报错,编译运行正常
【问题待解决】自定义控件设计界面报错,编译运行正常
【问题症状】:
自定义控件写好后生成,拖到窗体上,可以对其属性进行操作,当第二次打开窗体,就会显示一些乱七八糟的错,但是编译是能够通过的,而且运行也是正常的。截图如下:
这个错误是见的次数较多的,还有其他的莫名其妙的错误。
【问题未解决】:
无奈之下,只好打开了页面的designer.cs和.resx,其中倒是发现了一些端倪,截图如下:
都指向自定义控件的DataSource属性,于是就尝试将.resx的部分代码给删去。结果出乎意料啊,没有问题,设计器再开再关都没有问题了,但是把自定义控件删除后重新再拉一个,那段代码又自动出现。不能忍啊。依然是DataSource的问题,然后就在自定义控件的构造方法中添加了一行:DataSource=null;,结果也是出乎意料,问题似乎是解决了,开关设计器或者删除后再添加都没有出错,事情似乎可以告一段落了,但是在构造方法中设置自己的数据源为空,似乎是一个很奇葩另类的事。这种解决思路pass了。
既然是DataSource的问题,那就到自定义控件中来找问题。
public List<ComBoxItem> DataSource { get { return items; } set { items = value; } }
似乎也没有问题,于是把DataSource替换成自动属性,放弃使用内部字段items,再生成再拖来拖去试验,再没报过错。问题似乎更加清晰了,“items”的初始值。items作为私有字段,可以在构造方法中赋值,也可以在load事件中赋值。但是,在这个自定义控件中,却是在items被定义的时候赋值的“ private List<ComBoxItem> items=new List<ComBoxItem>();”,只开辟了内存空间,并没有给出实际的对象。问题的解决已经到了一定程度,现在既要让内部使用items字段,又要给外部提供访问途径,最后将items的初始值(也就是new)给去掉了,问题得到了解决(但这不是我想要的效果)。
【反思】:
1.在解决这个问题的过程中,看到有人通过DesignMode或者Site.DesignMode属性,“过滤”一部分操作,使控件在设计界面不致崩溃。菜鸟D记得有一个特性(Attribute)标记控件后,控件在设计界面只做显示,不会加载与数据相关的东西(这才是我想要的效果),可惜没有找到(不知道是记错了,还是压根就没有)。关于DesignMode的可以参考http://www.cnblogs.com/wuhuacong/p/3508467.html
2.关于特性(attribute):了解得不多,如[DesignTimeVisible(false)]可以使控件在工具箱中隐藏(属于无法理解的用途,控件在工具箱里找不到,做出来不是让用的么);
[Category("外观")]为标记的(控件)属性的分类,属于外观属于行为或者属于数据,也可以自己定义一个分类;
[Browsable(false)]标记的属性在属性窗体在可见或不可见
[Description("与控件关联的文本")]为标记的(控件)属性添加描述,可以在属性窗体中查看,如图:
3.自定义控件中不可避免要提供一些供外界访问的途径,常用的有属性和事件,事件在此节不做讨论,现在先说属性的问题。属性是为外界提供访问内部私有字段(内部资源)的安全有效的途径。
自动属性(也有人叫它自实现属性)是添加属性的一个快捷方式,输入prop,按下回车键,然后一个属性的模板就生成好了,只需要修改属性的类型和属性名就OK了,通过代码片实现的,不是什么稀奇的操作。
菜鸟D的这篇文字并没有什么高深技术,牛13理论,只是从简单细微的地方发现反思问题,这个解决问题的思路包括手段都很稚嫩,老鸟们看了笑就笑了,菜鸟们看了笑也就笑了,本来这思路也不是个人独有的(甚至对和错都不一定),如有谬误,欢迎指正,菜鸟D期待进步。
这篇文字里并没有从实质或者大方面来解决标题中的问题,只是针对了一个特例,若读者有更巧妙的思路和方法,欢迎评论或者联系本人QQ:1304679383.
菜鸟D希望这篇文字对您有所帮助。
【问题待解决】自定义控件设计界面报错,编译运行正常