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

liangxu7s10705 2011-01-13 12:05:30
如题,我重写了TabPageCollection类,并且重写了TabControl以及TabPage,现在想要实现的功能都实现的差不多了,但是有一个问题就是在设计界面的时候添加选项卡竟然还是添加的TabPage对象而不是我重写的,如果想要用我重写的TabPage只能去设计器代码中修改系统生成的代码。。。把TabPage换成了MyTabPage后出现的就是我自己写的了。。请问怎样才能让ADD默认添加的是我自定义的控件
...全文
258 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
内容概要:本文档为一份《计算机程序设计语言(C++)》课程的实验报告,涵盖了从基础语法到面向对象编程的多个实验内容。实验内容包括基础语法练习(如银行存款计算、数值比较、科学计算)、控制结构(分支与循环,如闰年判断、素数判定、Kaprekar黑洞数)、数组操作(一维与二维数组的排序、查找、极值计算、杨辉三角)、函数定义与应用(递归、参数传递、函数重载)以及面向对象编程(类与对象的设计、继承、多态性、文件操作)。文档详细展示了每个实验的任务描述、具体C++代码实现、测试结果及实验分析,体现了从简单到复杂、逐步深入的学习路径。; 适合人群:具备C++基础语法知识,正在学习或巩固程序设计课程的在校大学生及初级编程学习者。; 使用场景及目标:①作为C++课程的配套实验指导材料,帮助学生通过实践掌握编程基础知识和核心算法;②用于自学练习,提升对循环、数组、函数和面向对象等核心概念的理解与编码能力。; 阅读建议:学习者应结合文档中的代码实例,动手在编程环境中逐一实现并调试,重点关注代码逻辑、边界条件处理和算法效率,通过对比预期输出与实际输出加深对知识点的掌握。

111,129

社区成员

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

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

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