日期:2014-05-20  浏览次数:20830 次

有难度的自定义控件TabControl问题,这个问题解决了,你在上海月薪可达8800!
如果你能解决这个问题,那么就能证明你是一个骨灰级的大鸟了!
所以依你的能力在上海一定可以拿8K+以上
切入正题:
1.winform里大家都用过tabcontrol控件吧,当我在设计的时候,拖放一个TabControl到窗体上去,设计器会自动给这个TabControl加两个TabPage,这是什么原因?

2.如果解决了上面这个问题,那么下面这个就比较简单了.
我继承TabControl类写了一个自定义控件叫做MyTabControl,
同时我继承了TabPage类写了一个自定义控件叫做MyTabPage,给他加了一个属性Menu
我的问题是:在我进行界面设计的时候,我拖放一个MyTabControl,设计器会自动给我添加两个标准的TabPage,从而导致TabPage到MyTabPage类型的转换错误,因为我在MyTabControl类里调用TabPage的类型都是MyTabPage,我现在想要实现的效果是,在设计界面里,拖一个MyTabControl到窗体上去如何能默认加入MyTabPage,同时通过TabPage集合编辑器加入的也是MyTabPage而不是标准的TabPage?

------解决方案--------------------
HI不做winform ,只能帮你顶下了。
------解决方案--------------------
看了我的工资在上海这么高啊?可实际咋没呢?555555
------解决方案--------------------
第一个问题直接问微软,为什么要默认加2个tabpage
------解决方案--------------------
既然它自己加了2个tabpage你在加载自定义控件的时候,先清除所有page,然后自己加载你的mytabpage

TabPage集合编辑器--自己写属性吧
------解决方案--------------------
这是它的设计期行为规定的
Tabcontrol中声明
[ClassInterface(ClassInterfaceType.AutoDispatch), Designer("System.Windows.Forms.Design.TabControlDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), SRDescription("DescriptionTabControl"), DefaultEvent("SelectedIndexChanged"), DefaultProperty("TabPages"), ComVisible(true)]

而TabControlDesigner.InitializeNewComponent实现
public override void InitializeNewComponent(IDictionary defaultValues)
{
base.InitializeNewComponent(defaultValues);
try
{
this.addingOnInitialize = true;
this.OnAdd(this, EventArgs.Empty);
this.OnAdd(this, EventArgs.Empty);
}
finally
{
this.addingOnInitialize = false;
}
MemberDescriptor member = TypeDescriptor.GetProperties(base.Component)["Controls"];
base.RaiseComponentChanging(member);
base.RaiseComponentChanged(member, null, null);
TabControl component = (TabControl) base.Component;
if (component != null)
{
component.SelectedIndex = 0;
}
}
其中this.OnAdd(this, EventArgs.Empty);就是加入两个 tabpage
再看看OnAdd的实现
private void OnAdd(object sender, EventArgs eevent)
{
TabControl component = (TabControl) base.Component;
IDesignerHost service = (IDesignerHost) this.GetService(typeof(IDesignerHost));
if (service != null)
{
DesignerTransaction transaction = null;
try
{
try
{
transaction = service.CreateTransaction(SR.GetString("TabControlAddTab", new object[] { base.Component.Site.Name }));
}
catch (CheckoutException exception)
{
if (exception != CheckoutException.Canceled)
{
throw exception;
}
return;
}
MemberDescriptor member = TypeDescriptor.GetProperties(component)["Controls"];
TabPage page = (TabPage) service.CreateComponent(typeof(TabPage));
if (!this.addingOnInitialize)
{
base.RaiseComponentChanging(member);
}
page.Padding = new Padding(3);
string str = null;
PropertyDescriptor descriptor2 = TypeDescriptor.GetProperties(page)["Name"];
if ((descriptor2 != null) && (descriptor2.PropertyType == typeof(string)))
{
str = (string) descriptor2.GetValue(page);
}
if (str != null)
{