自定义控件的问题~帮顶有分!
我从一个控件派生了一个自定义控件,在构造函数里添加了一些代码:比如说我继承的是ComboBox,我在派生的类的构造函数里对ComboBox添加了2项选项,然后我将这个自定义控件放到Form上后,在form的构造函数里又自动的添加了这2个选项,并且,我只要在设计器里每对这个控件作出改动,就会自动的又添加2个选项。。。
我想知道如何能使我在构造函数里添加的选项不会在Form里又再次被添加
问题点数:100、回复次数:26Top
1 楼lalac(水月流影)回复于 2006-06-04 14:26:47 得分 0
还是把你的Code贴出来看看吧。
不过我猜想你的构造函数一定是这么写的:
public ClassName() : base()
{
this.Item.Add(...);
}
这样在你每次修改后都会添加项了。Top
2 楼xiyun(Cancer)回复于 2006-06-04 21:17:29 得分 0
是这样写的,那应该怎么写呢,谢谢了Top
3 楼amandag(高歌)回复于 2006-06-04 21:18:38 得分 1
upTop
4 楼fire_qu(金迷之蓝色忧郁)回复于 2006-06-05 09:50:17 得分 1
up,学习Top
5 楼elivehai(一切皆有可能)回复于 2006-06-05 10:22:48 得分 1
帮顶了。。
Top
6 楼KylinChina()回复于 2006-06-05 10:34:58 得分 1
upTop
7 楼yuwenge(活得痛快)回复于 2006-06-05 21:38:29 得分 1
重载构造函数,那么不调用添加项的构造函数来定义控件就不会多添加了.Top
8 楼VirtualDesktop(^_^)回复于 2006-06-05 22:04:22 得分 1
楼上正解~不说了Top
9 楼liminlovemama( 大森林)回复于 2006-06-05 22:07:18 得分 1
不明白....郁闷...Top
10 楼BlueDog(身正方能顶天立地,心和才可容士纳物。)回复于 2006-06-05 23:19:25 得分 1
可以用静态构造函数添加。不过你这两项是不是所有该控件全部有的呀,如果是就没问题Top
11 楼ilovejolly(有些伤感)回复于 2006-06-06 10:51:55 得分 1
markTop
12 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-06-06 10:57:00 得分 5
尝试重写OnInit方法,在里面加入项。Top
13 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-06-06 11:01:41 得分 5
不清楚为什么会有这样的需求,其实把这个操作放到一个方法中去就肯定不会出问题了。1.1里面也通过判断HttpContext.Current是否为空,2.0里面判断DesignMode属性都能知道是不是在设计期,在设计期跳过这些代码也是一个办法……Top
14 楼xiyun(Cancer)回复于 2006-06-06 14:52:02 得分 0
楼上的,DesignMode 这个属性完全无效。。。
我放到构造函数的目的是为了在其他地方直接从ToolBox里拉出来放到界面上就可以了,不用再写任何代码了。Top
15 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-06-06 15:06:46 得分 5
楼上的,DesignMode 这个属性完全无效。。。
别告诉我你在构造函数里面判断……自己想一下这个属性被赋值的时机。Top
16 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-06-06 15:12:06 得分 5
如果你是这种需求,可以尝试用ToolboxDataAttribute看看能不能解决问题。Top
17 楼tdtdtdtdtd123(飘)回复于 2006-06-07 09:59:50 得分 1
up budongTop
18 楼xiyun(Cancer)回复于 2006-06-09 10:35:33 得分 0
lvony。。我的不是asp的Top
19 楼amandag(高歌)回复于 2006-06-09 10:38:47 得分 1
不懂,帮顶Top
20 楼Ivony(授人以鱼不如授人以渔,上海谋生)回复于 2006-06-09 10:41:29 得分 5
与ASP有什么关系?
在构造函数里面,对象还没构造好,谁能给一个属性赋值,所以DesignMode属性只能在OnInit等方法内使用。
ToolboxDataAttribute可以控制你的控件拖到设计器上自动生成的代码。Top
21 楼skyline81()回复于 2006-06-09 16:44:46 得分 1
帮顶Top
22 楼lalac(水月流影)回复于 2006-06-10 14:54:37 得分 60
其实原因是这样的,微软的Designer在构造ComboBox时会判断当前的Items是否为默认值,通常可以使用DefaultValue或者ShouldSerrilizeItems来得到这个状态。另外,在ComboBox的ObjectCollection里面还有一些其他操作,也会影响IDE生成代码。
回到楼主的问题,当楼主在构造函数里添加了几项到Items里之后,默认情况下,IDE会自己在生成Code时把现有Items里的项再加一遍,而构造函数还是会被执行,这样Items里就出现了两遍所添加的项了。
处理办法有:
1、修改Items的DefaultValue或者重写ShouldSerrilizeItems方法,让他们在有你添加的项时返回Flase。
2、如果上面的还不能达到结果,建议重写Items属性和ObjectCollection类,这样就可以完全自己控制代码生成了。Top
23 楼tdtdtdtdtd123(飘)回复于 2006-06-11 16:48:44 得分 1
帮顶
Top
24 楼allismine()回复于 2006-06-13 20:45:31 得分 1
感觉是因为每次刷新造成的,考虑不让这个地方刷新或者在Page_load中,对这段代码放在Page.IsPostedBack等于false中,那样只有在初始化该页面时才加载自定义控件,而在刷新或者IE返回等不加载该控件。Top
25 楼mhxcy()回复于 2006-06-14 08:33:39 得分 1
顶Top
26 楼xiyun(Cancer)回复于 2006-06-17 13:58:00 得分 0
问题算是解决了
用ShouldSerrilizeItems这个属性解决的,不过有个后遗症。。。不能通过设计器修改那个被重载的属性了
结贴了Top




