自定义控件的问题~帮顶有分!

时间:2021-05-10 05:06:00
我从一个控件派生了一个自定义控件,在构造函数里添加了一些代码:比如说我继承的是ComboBox,我在派生的类的构造函数里对ComboBox添加了2项选项,然后我将这个自定义控件放到Form上后,在form的构造函数里又自动的添加了这2个选项,并且,我只要在设计器里每对这个控件作出改动,就会自动的又添加2个选项。。。
我想知道如何能使我在构造函数里添加的选项不会在Form里又再次被添加

26 个解决方案

#1


还是把你的Code贴出来看看吧。

不过我猜想你的构造函数一定是这么写的:
public ClassName() : base()
{
  this.Item.Add(...);
}

这样在你每次修改后都会添加项了。

#2


是这样写的,那应该怎么写呢,谢谢了

#3


up

#4


up,学习

#5


帮顶了。。

#6


up

#7


重载构造函数,那么不调用添加项的构造函数来定义控件就不会多添加了.

#8


楼上正解~不说了

#9


不明白....郁闷...

#10


可以用静态构造函数添加。不过你这两项是不是所有该控件全部有的呀,如果是就没问题

#11


mark

#12


尝试重写OnInit方法,在里面加入项。

#13


不清楚为什么会有这样的需求,其实把这个操作放到一个方法中去就肯定不会出问题了。1.1里面也通过判断HttpContext.Current是否为空,2.0里面判断DesignMode属性都能知道是不是在设计期,在设计期跳过这些代码也是一个办法……

#14


楼上的,DesignMode 这个属性完全无效。。。
我放到构造函数的目的是为了在其他地方直接从ToolBox里拉出来放到界面上就可以了,不用再写任何代码了。

#15


楼上的,DesignMode 这个属性完全无效。。。


别告诉我你在构造函数里面判断……自己想一下这个属性被赋值的时机。

#16


如果你是这种需求,可以尝试用ToolboxDataAttribute看看能不能解决问题。

#17


up budong

#18


lvony。。我的不是asp的

#19


不懂,帮顶

#20


与ASP有什么关系?

在构造函数里面,对象还没构造好,谁能给一个属性赋值,所以DesignMode属性只能在OnInit等方法内使用。

ToolboxDataAttribute可以控制你的控件拖到设计器上自动生成的代码。

#21


帮顶

#22


其实原因是这样的,微软的Designer在构造ComboBox时会判断当前的Items是否为默认值,通常可以使用DefaultValue或者ShouldSerrilizeItems来得到这个状态。另外,在ComboBox的ObjectCollection里面还有一些其他操作,也会影响IDE生成代码。

回到楼主的问题,当楼主在构造函数里添加了几项到Items里之后,默认情况下,IDE会自己在生成Code时把现有Items里的项再加一遍,而构造函数还是会被执行,这样Items里就出现了两遍所添加的项了。

处理办法有:
1、修改Items的DefaultValue或者重写ShouldSerrilizeItems方法,让他们在有你添加的项时返回Flase。
2、如果上面的还不能达到结果,建议重写Items属性和ObjectCollection类,这样就可以完全自己控制代码生成了。

#23


帮顶

#24


感觉是因为每次刷新造成的,考虑不让这个地方刷新或者在Page_load中,对这段代码放在Page.IsPostedBack等于false中,那样只有在初始化该页面时才加载自定义控件,而在刷新或者IE返回等不加载该控件。

#25


#26


问题算是解决了
用ShouldSerrilizeItems这个属性解决的,不过有个后遗症。。。不能通过设计器修改那个被重载的属性了

结贴了

#1


还是把你的Code贴出来看看吧。

不过我猜想你的构造函数一定是这么写的:
public ClassName() : base()
{
  this.Item.Add(...);
}

这样在你每次修改后都会添加项了。

#2


是这样写的,那应该怎么写呢,谢谢了

#3


up

#4


up,学习

#5


帮顶了。。

#6


up

#7


重载构造函数,那么不调用添加项的构造函数来定义控件就不会多添加了.

#8


楼上正解~不说了

#9


不明白....郁闷...

#10


可以用静态构造函数添加。不过你这两项是不是所有该控件全部有的呀,如果是就没问题

#11


mark

#12


尝试重写OnInit方法,在里面加入项。

#13


不清楚为什么会有这样的需求,其实把这个操作放到一个方法中去就肯定不会出问题了。1.1里面也通过判断HttpContext.Current是否为空,2.0里面判断DesignMode属性都能知道是不是在设计期,在设计期跳过这些代码也是一个办法……

#14


楼上的,DesignMode 这个属性完全无效。。。
我放到构造函数的目的是为了在其他地方直接从ToolBox里拉出来放到界面上就可以了,不用再写任何代码了。

#15


楼上的,DesignMode 这个属性完全无效。。。


别告诉我你在构造函数里面判断……自己想一下这个属性被赋值的时机。

#16


如果你是这种需求,可以尝试用ToolboxDataAttribute看看能不能解决问题。

#17


up budong

#18


lvony。。我的不是asp的

#19


不懂,帮顶

#20


与ASP有什么关系?

在构造函数里面,对象还没构造好,谁能给一个属性赋值,所以DesignMode属性只能在OnInit等方法内使用。

ToolboxDataAttribute可以控制你的控件拖到设计器上自动生成的代码。

#21


帮顶

#22


其实原因是这样的,微软的Designer在构造ComboBox时会判断当前的Items是否为默认值,通常可以使用DefaultValue或者ShouldSerrilizeItems来得到这个状态。另外,在ComboBox的ObjectCollection里面还有一些其他操作,也会影响IDE生成代码。

回到楼主的问题,当楼主在构造函数里添加了几项到Items里之后,默认情况下,IDE会自己在生成Code时把现有Items里的项再加一遍,而构造函数还是会被执行,这样Items里就出现了两遍所添加的项了。

处理办法有:
1、修改Items的DefaultValue或者重写ShouldSerrilizeItems方法,让他们在有你添加的项时返回Flase。
2、如果上面的还不能达到结果,建议重写Items属性和ObjectCollection类,这样就可以完全自己控制代码生成了。

#23


帮顶

#24


感觉是因为每次刷新造成的,考虑不让这个地方刷新或者在Page_load中,对这段代码放在Page.IsPostedBack等于false中,那样只有在初始化该页面时才加载自定义控件,而在刷新或者IE返回等不加载该控件。

#25


#26


问题算是解决了
用ShouldSerrilizeItems这个属性解决的,不过有个后遗症。。。不能通过设计器修改那个被重载的属性了

结贴了