在C#中如何重写控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中如何重写控件相关的知识,希望对你有一定的参考价值。

环境: C# WinForm

由于程序须要我想重写Label控件(当然不是完全重写,是继承后).
但是如果我重写后该怎么使用它呢?我想我重写后的控件还是所见即所得的,就是可以在VS里面编辑的那种.

不知道大家看明白我的意思没,我是说现在的问题是我不知道怎么重写后的控件还是所见即所得的,并且我还不知道重写后怎么使用它.最重要的是要直接在我工程里面写代码的,不要生成的DLL然后引用的那种.
一楼的朋友,按你的方法拖不进去呀.我用的是VS2005.
二楼的,你的方法太麻烦了.

你按照下边的方法重写出来一个控件以后,复制粘贴这个控件就能出来很多个。就像一楼说的那样,很简单的,不麻烦。

1. 首先你把一个label控件拖到窗体上。

2. 创建一个准备继承的类,比如叫MyLabel,派生于Label类

class MyLabel : System.Windows.Forms.Label

// 你自己重写的内容

3. 打开Form1.Designer.cs文件,你会看到有这么一行。
private System.Windows.Forms.Label label1;
修改为
private MyLabel label1;

再找到this.label1 = new System.Windows.Forms.Label();
修改为this.label1 = new MyLabel();

然后编译,运行,此时窗体上的这个控件就是MyLabel类创造出来的了。
________________________________________________

或者这样也行,创建——Windows控件库,自己创建一个重写后的labal控件。
然后再工具箱——选择项,功能添加进来,就能“一劳永逸”了。
参考技术A 在你的代码中保证包含如下代码即可

private System.ComponentModel.IContainer components = null;

protected override void Dispose(bool disposing)

if (disposing && (components != null))

components.Dispose();

base.Dispose(disposing);


private void InitializeComponent()

components = new System.ComponentModel.Container();
本回答被提问者采纳
参考技术B 你可以建一个用户控键页面,编写你想的写的代码,之后在别的页面只须将其拖入就可以使用了。 参考技术C /// <summary>
/// 覆盖窗口过程!处理WM_CHAR消息!
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)

int charcode = (int)m.WParam;
switch (m.Msg)

case WM_CHAR:
// 遇到非法字符,直接return即可过滤非法字符!break表示处理该字符
//屏蔽小数点
if (charcode == (int)Keys.Decimal)
return;

// 注意delete,backspace字符不能过滤!!!
// ctrl-a,ctrl-c,ctrl-v快捷键操作不能屏蔽!
if (charcode == (int)Keys.Back || charcode == (int)Keys.Delete)
break;

//如果按下了CTRL键
if (charcode == 1 //ctrl a
|| charcode == 3 //ctrl c
|| charcode == 22 //ctrl v
|| charcode == 24 //ctrl x
)
break;

if (this.m_FilterStr.IndexOf((char)charcode) < 0)
return;
break;

case WM_KEYDOWN:
//ctrl-A 全选
if (Control.ModifierKeys == Keys.Control)

if(charcode==(int)Keys.A)
this.SelectAll();

break;

case WM_PASTE:
//粘贴消息
IDataObject obj = Clipboard.GetDataObject();
if (obj == null)
return;
if (obj.GetDataPresent(DataFormats.Text))

string text = obj.GetData(DataFormats.Text) as string;
if (text == null)
return;
foreach (char c in text)

//查看是否含有过滤字符以外的字符!
if (this.m_FilterStr.IndexOf(c) < 0)
return;


break;

//处理消息
base.WndProc(ref m);

控件是对数据和方法的封装。控件可以有自己的属性和方法。属性是控件数据的简单访问者。方法则是控件 的一些简单而可见的功能。

c#如何重写类?

参考技术A

我们首先要写一个自定义的事件参数,为了简单起见,我们的自定义按钮控件,增加一个TagNumber属性,它传递一个整型数据,当我们处理控件的Click事件,能够从事件参数类实例中取得我们在这个属性中设置的值,因此,我们需要一个MyButtonClickAgre,它从EventArgs类派生。

[csharp] view plaincopyprint?

    /// <summary>  

    /// 自定义事件参数类。  

    /// </summary>  

    internal class MyButtonClickAgre : EventArgs  

      

    int _value;  

    public MyButtonClickAgre(int n)  

      

    this._value = n;  

      

    public int TheNumber  

      

    get  return this._value;   

      

      


    现在,从Button类派生一个新类。

    [csharp] view plaincopyprint?

    public class MyButton:Button  

      

    int _num;  

    // 构造函数  

    public MyButton()  

    : base()  

      

    this._num = 0;  

      

    /// <summary>  

    /// 用作参数传递的整型数据。  

    /// </summary>  

    [System.ComponentModel.Browsable(true)]  

    [System.ComponentModel.Description("获取或设置一个整数。")]  

    [System.ComponentModel.Category("数据")]  

    public int TagNumber  

      

    get  return this._num;   

    set  this._num = value;   

      

      

    好,TagNumber属性定义好了,Browsable特性表示控件中设计时是否显示在“属性”窗口中,Description用一些文本描述属性有什么用途这类的信息,Category表示该属性在“属性”窗口属于哪个类别,可能很多人觉得要传递一个英文的字符串作为分类名,其实不一定,如果你的VS是中文版的,你完全可以使用中文名字,如上面的“数据”。

    在“属性”窗口中浏览该控件的属性如下图所示。

    下面,我们还有一件重要的事情要做,那就是重写基类的Click事件。这里有两种方法:

    1、第一种方法不算得上是重写事件,应该说是我们经常做的重写On????方法,如我们下面要通过重写OnClick方法来达到我们要的效果。

    [csharp] view plaincopyprint?

    /// <summary>  

    /// 重写OnClick方法。  

    /// </summary>  

    protected override void OnClick(EventArgs e)  

      

    base.OnClick(new MyButtonClickAgre(this._num));  

      


    这样,我们自定义的事件参数就传到事件处理程序了。

    2、第二种方法才算是重写事件,通过new关键字重新定义一个Click事件。

    [csharp] view plaincopyprint?

    // 新的Click事件。  

    public new EventHandler Click;  

    /// <summary>  

    /// 重写OnClick方法。  

    /// </summary>  

    protected override void OnClick(EventArgs e)  

      

    if (Click != null)  

      

    Click(this, new MyButtonClickAgre(this._num));  

      

      


    这个时候,我们就不需要基类的OnClick方法了,所以也不用再写上base.OnClick(e);。

    现在,我们重新生成一下项目,切换到WinForm设计器窗口,在工具箱中就能看到我们自定义的控件了。

    好,现在可以测一测这个新控件了。

    [csharp] view plaincopyprint?

    public partial class Form1 : Form  

      

    public Form1()  

      

    InitializeComponent();  

      

    private void myButton1_Click(object sender, EventArgs e)  

      

    if (e is MyButtonClickAgre)  

      

    MyButtonClickAgre ce = e as MyButtonClickAgre;  

    if (ce != null)  

      

    MessageBox.Show(ce.TheNumber.ToString());  

      

      

      

      

以上是关于在C#中如何重写控件的主要内容,如果未能解决你的问题,请参考以下文章

C# 重写LinkLabel控件的click事件

C#重写一个控件Label

C# (winform)如何改变控件形状

如何在C#里面描绘图片中那种波形?还有如何添加圆形可调节控件呢?

C#,winform程序中datagridview控件怎么使用多层表头?请教一下,谢谢!

C# WinForm设置控件居中