在.net应用程序中使用用户控件

程序|控件

在.net应用程序中使用用户控件

郑佐2004-11-30

做过asp.net的人都知道开发的时候使用用户控件很方便,为功能模块化提供了相当大的灵活性。令人高兴的是开发Windows窗体也可以使用用户控件。这里我们来看看为用户控件添加属性和事件,并实现把消息发送到父容器。本文主要是为没有使用过用户控件的朋友提供一些参考。

用户控件的实现比较简单,直接从System.Windows.Forms.UserControl。

public class UserControl1 : System.Windows.Forms.UserControl

为了便于测试我在上面添加了一个TextBox,并注册TextBox的TextChanged事件,

this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);

事件处理函数,

private void textBox1_TextChanged(object sender, System.EventArgs e)

{

MessageBox.Show(this.textBox1.Text);

}

这里演示如果控件中文本框的内容改变就会用MessageBox显示当前的文本框内容。

控件显示如下:

在窗体中添加上面的用户控件,当我们改变textBox的文本时,可以看到跳出一个对话框,很简单吧。

下面来看看对控件添加属性。

这里定义一个私有变量。

private string customValue;

添加访问他的属性

public string CustomValue

{

get{return customValue;}

set{customValue =value;}

}

在窗体中使用的时候像普通控件一样进行访问,

userControl11.CustomValue = "用户控件自定义数据";

通过事件可以传递消息到窗体上,在定义之前我们先来写一个简单的参数类。

public class TextChangeEventArgs : EventArgs

{

private string message;

public TextChangeEventArgs(string message)

{

this.message = message;

}

public string Message

{

get{return message;}

}

}

定义委托为,

public delegate void TextBoxChangedHandle(object sender,TextChangeEventArgs e);

接下去在用户控件中添加事件,

//定义事件

public event TextBoxChangedHandle UserControlValueChanged;

为了激发用户控件的新增事件,修改了一下代码,

private void textBox1_TextChanged(object sender, System.EventArgs e)

{

if(UserControlValueChanged != null)

UserControlValueChanged(this,new TextChangeEventArgs(this.textBox1.Text));

}

好了,为了便于在Csdn上回答问题,把完整的代码贴了出来:

using System;

using System.Collections;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

namespace ZZ.WindowsApplication1

{

public class UserControl1 : System.Windows.Forms.UserControl

{

private System.Windows.Forms.TextBox textBox1;

private string customValue;

private System.ComponentModel.Container components = null;

public string CustomValue

{

get{return customValue;}

set{customValue =value;}

}

//定义事件

public event TextBoxChangedHandle UserControlValueChanged;

public UserControl1()

{

InitializeComponent();

}

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region 组件设计器生成的代码

private void InitializeComponent()

{

this.textBox1 = new System.Windows.Forms.TextBox();

this.SuspendLayout();

this.textBox1.Location = new System.Drawing.Point(12, 36);

this.textBox1.Name = "textBox1";

this.textBox1.TabIndex = 0;

this.textBox1.Text = "textBox1";

this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);

this.Controls.Add(this.textBox1);

this.Name = "UserControl1";

this.Size = new System.Drawing.Size(150, 92);

this.ResumeLayout(false);

}

#endregion

private void textBox1_TextChanged(object sender, System.EventArgs e)

{

if(UserControlValueChanged != null)

UserControlValueChanged(this,new TextChangeEventArgs(this.textBox1.Text));

}

}

//定义委托

public delegate void TextBoxChangedHandle(object sender,TextChangeEventArgs e);

public class TextChangeEventArgs : EventArgs

{

private string message;

public TextChangeEventArgs(string message)

{

this.message = message;

}

public string Message

{

get{return message;}

}

}

}

使用时要在窗体中注册上面的事件,比较简单都贴源代码了,

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

namespace ZZ.WindowsApplication1

{

public class Form1 : System.Windows.Forms.Form

{

private WindowsApplication1.UserControl1 userControl11;

private System.ComponentModel.Container components = null;

public Form1()

{

InitializeComponent();

userControl11.CustomValue = "用户控件自定义数据";

userControl11.UserControlValueChanged += new TextBoxChangedHandle(userControl11_UserControlValueChanged);

}

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows 窗体设计器生成的代码

private void InitializeComponent()

{

this.userControl11 = new WindowsApplication1.UserControl1();

this.SuspendLayout();

this.userControl11.Location = new System.Drawing.Point(8, 8);

this.userControl11.Name = "userControl11";

this.userControl11.Size = new System.Drawing.Size(150, 84);

this.userControl11.TabIndex = 0;

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.ClientSize = new System.Drawing.Size(292, 193);

this.Controls.Add(this.userControl11);

this.Name = "Form1";

this.Text = "Form1";

this.ResumeLayout(false);

}

#endregion

[STAThread]

static void Main()

{

Application.Run(new Form1());

}

private void userControl11_UserControlValueChanged(object sender, TextChangeEventArgs e)

{

MessageBox.Show("当前控件的值为:" + e.Message);

}

}

}

另外需要动态加载,就把控件添加在容器的Controls集合就行了,下面是在构造函数中添加控件,

public Form1()

{

InitializeComponent();

UserControl1 uc = new UserControl1();

uc.CustomValue = "动态加载的用户控件";

uc.UserControlValueChanged += new TextBoxChangedHandle(userControl11_UserControlValueChanged);

this.Controls.Add(uc);

}

另外从VS.net中的工具箱中拖动用户控件到窗体上,如果是第一次需要编译一下项目。

时间: 2024-11-03 12:36:13

在.net应用程序中使用用户控件的相关文章

在Silverlight 2应用程序中切换用户控件的技巧

摘要 大家都知道,在Silverlight 2应用程序中,每个应用程序将生成一个xap文件,每一个xap文件中只能 设置一个起始的用户控件.如果我们有多个用户控件,需要在不同的ASP.NET页面中加载,最简单的方法 莫过于针对多个用户控件分别建立对应的Silverlight项目,但这种方式有很多的缺点,如我们的样式文 件需要在多个项目中进行拷贝. 准备 现在建立一个项目结构如下图所示,在Silverlight项目中我们有个三个用户控件:ContentPage. DefaultPage.Maste

在ASP.NET中使用用户控件

asp.net|控件 [摘要]ASP.NET中提供的用户控件,可以解决ASP中无法解决的代码重用问题,更方便了调试工作中的错误检查.本文通过用户控件实现方法讲解和一个用户控件例程的实现,进一步验证了利用用户控件解决代码重用的可行性和有效性. [关键字]代码重用.用户控件.@Register指令 ASP.NET提供了比传统ASP更好的代码分离方案.在传统的ASP中,要将用Server. Execute执行的ASP文件或事务对象组件的代码分离开,一般只能将代码分离成几个文件,然后使用"include

aspnet-请问ASP.NET中web用户控件中使用Session出错,麻烦帮忙解决下,拜托了

问题描述 请问ASP.NET中web用户控件中使用Session出错,麻烦帮忙解决下,拜托了 在用户控件中有下列代码: protected void Page_Load(object sender, EventArgs e) { if (Session["user"] != null) { login.Text = "欢迎你," + Session["user"].ToString().Trim(); login.NavigateUrl = Re

关于ASP.NET2.0 中的用户控件编程使用

asp.net|编程|控件 今天用了一下2.0中的用户控件,发现使用编程方式使用用户控件,跟1.X 中截然不同. 1.首先,要在所要使用的Page 头部声明引用.如下: <%@ Reference Control="../Controls/AlbumEditor.ascx" %> 2.在后置代码里,从"ASP"空间中就可以找到此控件的类引用了,不过还需要事例一下.-_-! 不明白设计者为什么要这么做,还不如1.1 那样直观.如下:  ASP.Contro

dataview数据绑定-C#winfrom程序中关于dataview控件的数据绑定问题!能显示但有点小问题!望指点!

问题描述 C#winfrom程序中关于dataview控件的数据绑定问题!能显示但有点小问题!望指点! 如图: 我希望绑定的数据显示在我以做好的Dataview格子内,结果它从旁边出来了,不知哪里设置不对.有遇到过相同情况的同学吗,望指点. 解决方案 我发表下我的意见, 你这个应该是在dategridview中 设置了列名,然后你填充的时候没有注意,直接填充的 如果你需要这些显示 你完全可以在填充前 select price as "成人票价" 这样的. 或者填充前把 ds设置列名什么

wpf中的用户控件库项目不能使用WindowsFormsHost??急!!!

问题描述 基于sharpdevelop框架的WPF开发,想在用户控件库项目中使用reportviewer控件,用了WindowsFormsHost,但是运行后不显示reportviewer.如果换成wpf窗体,就能显示reportviewer界面和数据.wpf中的用户控件库项目不能使用WindowsFormsHost吗? 解决方案 解决方案二:WindowsFormsHost是专门为window窗体设计的.放弃吧

非常非常重要的的问题(在ASP.NET中和vsC#应用程序中的各个控件的属性都有数据这一项;这一项怎么用呀???)

问题描述 在ASP.NET中和vsC#应用程序中的各个控件的属性都有属性数据这一项:这一项怎么用呀???)帮帮忙呀 解决方案 解决方案二:对控件的设置或数据绑定解决方案三:数据绑定后可以简单使用或定制使用数据解决方案四:数据捆定解决方案五:做数据绑定用.解决方案六:数据绑定,通常用来指定数据表的某一列,或者对象数据集里的某个属性.

在线等待答复:如何在程序中关闭某控件的某一事件。

问题描述 如何在程序中关闭某控件的某一事件,也就是说当运行某一个过程的时候,虽然触发条件也具备,但是此时我不希望事件被触发.等这个过程结束了再恢复,该怎麽做?谢谢 解决方案 解决方案二:control.Click-=newEventHandler(ControlClick);//...control.Click+=newEventHandler(ControlClick); 解决方案三:忘了说明,是vb.net下的.离开表格单元会激发Grid1.LeaveCell事件,现在想屏蔽它,之后再打开.

在DevExpress程序中使用TeeList控件以及节点查询的处理

在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件,也可以使用DevExpress的TreeList控件进行数据的展示,本篇随笔主要介绍基于DevExpress的TreeList控件使用以及使用SearchControl对节点进行查询的操作. 1. 使用微软的TreeView控件的实现效果和思路 在很多情况下,我们也倾向于使用TreeView控件作为