TabControl重写问题,如何默认添加为重写后的MyTabPage

liangxu7s10705 2011-01-13 12:05:30
如题,我重写了TabPageCollection类,并且重写了TabControl以及TabPage,现在想要实现的功能都实现的差不多了,但是有一个问题就是在设计界面的时候添加选项卡竟然还是添加的TabPage对象而不是我重写的,如果想要用我重写的TabPage只能去设计器代码中修改系统生成的代码。。。把TabPage换成了MyTabPage后出现的就是我自己写的了。。请问怎样才能让ADD默认添加的是我自定义的控件
...全文
213 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
VS菜单:工具->选择工具箱项->弹出的对话框中先.net framework->点下面的浏览->找到你的自定义控件的Dll确定->在工具箱中可以看到你自己的控件,可以拖拉了
liangxu7s10705 2011-01-13
  • 打赏
  • 举报
回复
嗯谢谢了。。我再去翻翻资料什么的
Dobzhansky 2011-01-13
  • 打赏
  • 举报
回复
工作量都不小, 另外资料也少

你可以找找非 TabControl 的多页实现.
liangxu7s10705 2011-01-13
  • 打赏
  • 举报
回复
谢谢。。又多学了一块。。。太感谢了。。。但是一直用网上的自己永远弄不明白这一块不是损失很大么呵呵~
请问

除非你编写自己的 tabcontroldesigner,
或者实现自己的 designer host.

那一个实现起来比较好一点呢?
Dobzhansky 2011-01-13
  • 打赏
  • 举报
回复
你那样会产生问题的, 不光 tabconrol 有 designer 的,
tabpage也有.

那样, 行为变得不符合预期了
Dobzhansky 2011-01-13
  • 打赏
  • 举报
回复
设计器的组件 , 控件, 都有一个 Designer 照看着,

对于 TabControl , 就是 TabControlDesigner,

[DefaultProperty("TabPages")]
[ClassInterface(1)]
[DefaultEvent("SelectedIndexChanged")]
[ComVisible(true)]
[Designer("System.Windows.Forms.Design.TabControlDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public class TabControl : Control


控件在设计时的一些行为就是由这些 Designer 控制的,
比如 tabcontrol 设计时的 那个用于添加删除页的弹出菜单,
称为 DesignerVerb,

根据 TabControl 类声明, 可以看出, 控件类型跟设计器类型绑定了.
而对于 TabControl 的 TabPage 创建, Designer 内是写死的.

TabPage page = (TabPage)service.CreateComponent(typeof(TabPage));

service是 IDesignerHost.

所以有那两个办法思路.

变态的微软将 TabControlDesigner 实现在
System.Design.dll
并且是
internal TabControlDesigner
意味着你不能派生来定制她.

其实在网上有不少的可以替代 TabControl 的自定义实现,
都提供了很好的设计时支持.

在定制 TabControl 上, 你的这个需求不值得投入太大.
liangxu7s10705 2011-01-13
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;



namespace MyTabControl
{
/// <summary>
/// 自定义MyTabControl继承自TabControl
/// 使用自定义设计器MyTabControlDesigner
/// </summary>
[Designer("MyTabControl.MyTabControlDesigner")]
public class MyTabControl:TabControl
{

}
/// <summary>
/// 自定义MyTabPage继承自TabPage
/// </summary>
public class MyTabPage : TabPage {
public Menu menu { get; set; }
}

/// <summary>
/// 自定义设计器
/// </summary>
public class MyTabControlDesigner : System.Windows.Forms.Design.ScrollableControlDesigner
{


public override void InitializeNewComponent(IDictionary defaultValues)
{
//InitializeNewComponent方法中调用4次OnAdd
base.InitializeNewComponent(defaultValues);
this.OnAdd(this, EventArgs.Empty);
this.OnAdd(this, EventArgs.Empty);
this.OnAdd(this, EventArgs.Empty);
this.OnAdd(this, EventArgs.Empty);
}

private void OnAdd(object sender, EventArgs eevent) {
//这次我们不再Controls.Add TablePage而是新增MyTabPage
MyTabControl component = (MyTabControl)base.Component;
IDesignerHost service = (IDesignerHost)this.GetService(typeof(IDesignerHost));
//MemberDescriptor member = TypeDescriptor.GetProperties(component)["Controls"];
MyTabPage page = (MyTabPage)service.CreateComponent(typeof(MyTabPage));
component.Controls.Add(page);
}
}
}

终于被我翻到了。。。谢谢楼上各位
liangxu7s10705 2011-01-13
  • 打赏
  • 举报
回复
4楼的大哥,能麻烦您说的更详细一点么。。。
liangxu7s10705 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 winner213 的回复:]
如果你是采用继承重写的方法即你的的MyTabPage是继承自TabPage,那么通过代码去添加你的选项卡应该是不影响的吧
[/Quote]
是的如果通过代码去添加是一点都不影响的。。。但是不觉得那样根本不算是完成了么。。。。

回复5楼。。。我也不想重写,实在是TabControl达不到我想要的效果
flyerwing 2011-01-13
  • 打赏
  • 举报
回复
搞不懂,为什么什么都非得重写.
Dobzhansky 2011-01-13
  • 打赏
  • 举报
回复
tab页的创建, 是由 designverb 中添加那个命令实现的

这个写死了, tabcontrol 设计器代码片断:
TabPage page = (TabPage)service.CreateComponent(typeof(TabPage));

除非你编写自己的 tabcontroldesigner,
或者实现自己的 designer host.
winner213 2011-01-13
  • 打赏
  • 举报
回复
如果你是采用继承重写的方法即你的的MyTabPage是继承自TabPage,那么通过代码去添加你的选项卡应该是不影响的吧
liangxu7s10705 2011-01-13
  • 打赏
  • 举报
回复
- -!我是说在我将自定义的TabControl拖进窗体之后添加新建选项卡的时候添加的不是我定义的MyTabPage,是系统的TabPage。。我现在想知道的是重写什么方法或者怎么才能实现添加选项卡的时候添加的是我自定义的MyTabPage

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧