C#常见控件的使用

更新时间:2024-05-16 09:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

控件的使用

P.S. 本章讲解常用控件的使用方法,将不对算法和语法加以解释。

控件

控件是视窗交互的工具。控件是一种特殊的类,所有控件都继承自System.Windows.Forms.Control类。这里Control就叫做控件的基类,控件就是Control的派生类。一个类从基类继承,就拥有基类的所有成员(包括:变量(亦称字段),属性,函数(函数亦称方法),事件,运算符)。类之间通过继承关系保证了派生类拥有需要的方法或字段。所以Control的成员就是控件的通性。这里列出了Control的常用成员: 名称 类别 用途 Control 构造函数 用于初始化一个控件 Dispose 方法 释放由 Control 使用的所有资源 Equals 方法 判断控件是否相同 Focus 方法 为控件设置输入焦点 GetContainerControl 方法 返回容器控件 GetType 方法 获取控件类型 RaiseDragEvent 方法 引发适当的拖动事件。 RaiseKeyEvent 方法 引发适当的键事件。 RaiseMouseEvent 方法 引发适当的鼠标事件。 RaisePaintEvent 方法 引发适当的绘画事件。 Refresh 方法 强制重绘自己和任何子控件 ResetBackColor 方法 将 背景色重置为其默认值。 ResetCursor 方法 重置光标 ResetFont 方法 重置字体 ResetForeColor 方法 重置前景色 ResetImeMode 方法 重置输入法 Select 方法 激活控件 Show 方法 向用户显示控件 ToString 方法 控件类名转为字符串 Update 方法 使控件重绘其无效区域 AllowDrop 属性 指示控件是否接受拖放数据 BackColor 属性 获取或设置控件的背景色。 BackgroundImage 属性 获取或设置在控件中显示的背景图像 CanFocus 属性 获取一个值,该值指示控件是否可以接收焦点。 Controls 属性 获取包含在控件内的控件的集合 Cursor 属性 获取或设置当鼠标指针位于控件上时显示的光标 Dock 属性 获取或设置哪些控件边框停靠到其父控件并确定控件如何随其父级一起调整大小。 DoubleBuffered Enabled Focused Font ForeColor Height Location Margin MousePosition Name Parent Size Tag Text Visible Width BackColorChanged BackgroundImageChanged Click DoubleClick DragDrop GotFocus KeyPress LocationChanged LostFocus MouseClick MouseEnter MouseHover MouseLeave MouseMove MouseUp MouseWheel Paint Resize TextChanged 属性 属性 属性 属性 属性 属性 属性 属性 静态属性 属性 属性 属性 属性 属性 属性 属性 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 事件 该值指示此控件是否应使用辅助缓冲区重绘其图面,以减少或避免闪烁 该值指示控件是否可以对用户交互作出响应 该值指示控件是否有输入焦点 获取或设置控件显示的文字的字体 获取或设置控件的前景色 获取或设置控件的高度 获取或设置该控件的左上角相对于其容器的左上角的坐标 获取或设置控件之间的空间 获取鼠标光标的位置(以屏幕坐标表示)。 获取或设置控件的名称 获取或设置控件的父容器 获取或设置控件的高度和宽度 获取或设置包含有关控件的数据的对象 获取或设置与此控件关联的文本 该值指示是否显示该控件 获取或设置控件的宽度 当 BackColor 属性的值更改时发生 当 BackgroundImage 属性的值更改时发生 在单击控件时发生 在双击控件时发生 在完成拖放操作时发生 在控件接收焦点时发生 在控件有焦点的情况下按下键时发生 在 Location 属性值更改后发生 当控件失去焦点时发生 在鼠标单击该控件时发生 在鼠标指针进入控件时发生。 在鼠标指针停放在控件上时发生。 在鼠标指针离开控件时发生。 在鼠标指针移到控件上时发生 在鼠标指针在控件上并释放鼠标键时发生 在移动鼠标滚轮并且控件有焦点时发生 在重绘控件时发生 在调整控件大小时发生 在 Text 属性值更改时发生 以上是最常用的成员,便于查找,完整列表参考

http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control_members.aspx

静态文本控件Label:

表示控件的文本标签,并提供对访问键的支持。

它是最简单的控件,用于显示文字,其实它不一定是静态的,显示的文字可以随时通过Text属性更改。常用的属性是Font、BackColor、ForeColor、Text、Location、Size、Visible。

超链接文本控件LinkLabel:

Windows 窗体 LinkLabel 控件使您能够向 Windows 窗体应用程序添加 Web 样式的链接。一切可以使用 Label 控件的地方都可以使用 LinkLabel 控件;还可以将文本的一部分设置为指向某个对象或网页的链接。

与Label类似,提供了类似超链接的文字样式,Label也可以设置Click事件,但LinkLabel更容易让人发现它被单击有不同的作用(由于它像超链接的样子)。也可以用作选项,【例】:

1 2

新建工程,设计界面如图:修改LinkLabel控件名字:linkOption 2.1 选择

2.2 修改(Name)属性 2.3 改为linkOption

2.3.1 P.S.以后就用linkOption表示这个控件,在C#代码中控件实例实质上是一个变量,变量类型就是控件的类。这就是这个控件的变量名。由于默认的名称linkLabel1没有实际意义,编程时通常先修改其名字,使其好记。由于是变量名所以命名规则与普通变量没有区别,由“_”或英文字母开头都是合法的,不允许重名。但通常许多控件共同运作来完成一件具体的事,所以通常习惯在控件前面加上小写的类型简称,后跟首字母大写的名称。这是一条基本技巧,以后不再重复介绍。

3

双击linkOption编辑代码 private void linkOption_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { linkOption.Text = linkOption.Text == \ ? \ : \; } 4 运行

5 多次单击linkOption查看效果。

这里使用了条件运算符来实现这个功能。

文本框TextBox:

表示 Windows 文本框控件。

文本框是提供用户数据输入输出的控件。【例】:求三角形面积

1 2 3

编辑界面如图

分别命名为txtA、txtB、txtC、txtArea 直接开始编辑代码: 3.1 新建函数 private void textBox_Change(object sender, EventArgs e) { double a = 0, b = 0, c = 0, p = 0; try { a = double.Parse(txtA.Text != \ ? txtA.Text : \); b = double.Parse(txtB.Text != \ ? txtB.Text : \); c = double.Parse(txtC.Text != \ ? txtC.Text : \); p = (a + b + c) / 2;

txtArea.Text = Math.Sqrt(p * (p - a) * (p - b) * (p - c)).ToString(); } catch (FormatException) { txtArea.Text = \类型错误\; } } 4

设置txtA、txtB、txtC的Click事件处理函数为textBox_Change:

4.1 按住Ctrl分别单击txtA、txtB、txtC以同时选择这三个控件

4.2 查看事件列表4.3 找到TextChange事件

4.4 选择textBox_Change

5 6 运行

输入一些数字查看运行情况。

还可以修改器PasswordChar属性使其变成密码框,这个属性的类型是char,只可以输入一个字符,用来代替原来显示文字的位置,令其为*或#看看效果吧:

1 2

编辑界面如图

设置其PasswordChar属性,输入一个字符

3 运行

4 输入一些文字看看效果

5 设置为其他值看看:如#、X、●、◆、★、■、§。

P.S. 这只是表面的现象,不影响Text属性的取值,仍然用Text属性取出或写入字符串。

也可以修改其Dock属性为Top或Bottom,文本框会立即保持与窗口同宽:

1 编辑界面如图

2 设置Dock属性为Top: 3 运行

4 改变窗体大小查看效果。

P.S. 你可能觉得这与窗体贴的过分地紧了,最好留一点边距,这也有办法,只需修改窗体的Padding属性,改为8, 8, 8, 8试试。

文本框还有Enable、ReadOnly、Visible属性,分别表示是否禁用文本框(变灰)、是否只读(用户不能修改其内容)和是否可见(设为false就不显示)是一些常用属性,其他控件也有,以后不再重复介绍。

Enable=false的效果

还有一个是MultiLine属性,使文本框可以是多行的

将其设为true

效果:

可以访问Lines属性修改其内容。

这时WordWrap属性还可指定它是否自动换行显示

WordWrap=true

WordWrap=false

这样的话显示不全,可更改ScrollBars属性,添加合适的滚动条

ScrollBars=Horizontal

ScrollBars=Vertical

ScrollBars=Both

按钮Button:

表示一个响应 ButtonBase.Click 事件的 Windows 按钮控件。

通常在鼠标对其操作(单击、双击等)时产生一些事件,并处理。 【例】:可对上述示例加以修改:

1 2 3 4 5 6 7 8

添加按钮如图

按钮命名为btnCalc

令btnCalc.Click=textbox_Change 清空txtA、txtB、txtC的Click处理函数查看代码找到textbox_Change 选中函数名

右击

鼠标指向“重构(R)”->

“重命名(R)…”,并单击。

9 改名为Calc_Click

10 确定 11 应用 12 运行

13 输入数并单击“Calculate”,查看效果

P.S. 更改已经定义好的函数名、变量名等标识符的名称请使用“重构->重命名”,它将自动为所有的标识符引用改名以匹配新的名字。这里的改名不是必要步骤(5-11步),但为了使实例更直观,避免混淆。

复选框CheckBox控件:

表示 Windows CheckBox。

它经常用于选项,使用非常简单,只需设定Text(显示的文本),根据需要获取或设置Checked值就可以了,这个属性表示是否勾选,为bool型。 【例】闹钟选项设置

1 2 3 4 5 { 编辑界面如图

使复选框的名字依次为chkSun、chkMon、chkTue、chkWed、chkThu、chkFri、chkSat 使按钮名字依次为btnApply、btnCancel 添加新的CheckBox[]数组 修改WinForm构造函数: private CheckBox[] checkBoxes; public Form1() InitializeComponent(); checkBoxes = new CheckBox[]{ this.chkSun, this.chkMon, this.chkTue, this.chkWed, this.chkThu, this.chkFri, this.chkSat }; } 6 双击Apply编辑Click事件处理函数 private void btnApply_Click(object sender, EventArgs e){ string str = \; foreach (CheckBox cb in checkBoxes) if ( cb.Checked) str += \ + cb.Text; if (str == \) str += \; MessageBox.Show(str); } 7 { this.Close(); } 双击Cancel编辑Click事件处理函数 private void btnCancel_Click(object sender, EventArgs e) 8 9

修改WinForm属性运行查看效果

P.S. 第8步设置了Winform的确定和取消按钮(即AcceptButton和CancelButton属性)可以看到按钮的视图效果会有所改变Apply按钮多了个蓝框,表示默认按钮,此时按Enter或Esc分别相当于按下了这两个按钮。这两个属性是专门为对话框按钮设置的简便方式。

这里建立了复选框的数组,用foreach语句遍历。注意:对象数组与数值数组有所不同,如果用已经定义的对象来初始化数组,那么元素与对应的对象完全相同(共用了一块内存区)任一一个的改动,会影响另一个的值。数值数组则仅仅把数值传了过去。两个对象的等于或不等运算是比较他们的内存地址是否相同,而不是每一个属性是否相同。对对象的操作需要多加以考虑

复选框还有第三种“待定”的状态,以前叫三态复选框,三种状态是通过CheckState属性获得的: 效果

Checked属性 True True False CheckState属性 Checked Indeterminate Unchecked

单选框RadioButton:

当与其他 RadioButton 控件成对出现时,使用户能够从一组选项中选择一个选项

单选框相对复选框较复杂一些,因为用户只能选一个,要把前一个选择的清除;如果有几组单选框,就更复杂。这就需要一个范围来约束单选框的行为,如果只有一组,它可以正常工作,WinForm会自动清除前一个选项。如果有多组,就需要容器控件来区分组别。

其中GroupBox是比较常用的。如图:

这样不需要代码来控制其行为。

由于只有一个选项,所以一般用主动传值的方式。 【例】选择国籍

1 2 3 4 编辑界面如图

单选框无需改名,按钮命名为btnOK、btnCancel 添加全程变量 private string str = \; 创建新函数 private void radio_Click(object sender, EventArgs e) { str = ((RadioButton)sender).Text; } 5 { 编辑OK按钮Click事件: private void btnOK_Click(object sender, EventArgs e) MessageBox.Show(\+str); } 6 { 编辑Cancel按钮Click事件: private void btnCancel_Click(object sender, EventArgs e) this.Close(); } 7 选择全部的单选框

8 9

编辑Click事件运行看看效果

数字框NumbericUpDown:

这是一种特殊的输入框,专门用来输入数字,通过Value属性获得其decimal型的值。使数据的输入更加方便。右侧有两个按钮可以让数字增加或减少。

【例】汇率换算

1 2 3

编辑界面如图

命名数字框为nudDollar和nudRMB 命名按钮btnD2R、btnR2D

4 编辑两个数字框的属性为如图

4.1 属性栏下方有解释5 再介绍。

编辑btnD2R的Click事件 所以属性的用途不

private void btnD2R_Click(object sender, EventArgs e) { nudRMB.Value = nudDollar.Value *(decimal)6.8352; } 6 编辑btnR2D的Click事件 private void btnR2D_Click(object sender, EventArgs e) { nudDollar.Value = nudRMB.Value / (decimal)6.8352; } 7

运行

下拉菜单ComboBox:

它可使用户从一定的范围内选择一项。当有大量的选项时,单选框就不实用用了,这样做太复杂。就应该使用下拉菜单。但当只有少量选项时还是用单选框对于用户更容易操作。

下拉菜单是一个集合类,下面还是给出一个选国籍的程序 【例】选择国籍

1 2 3 4

编辑界面如图

下拉菜单改名comNation

找到comNation.Items属性,单击右侧按钮

输入数据(每一行作为下拉菜单的一个项,也就是集合的一个元素)

5

6 { MessageBox.Show(\+comNation.SelectedItem.ToString()); } 7

运行

确定

双击下拉菜单进入comNation_SelectedIndexChanged函数的编辑

private void comNation_SelectedIndexChanged(object sender, EventArgs e) 可以看到用下拉菜单更加简便,几乎不用多少代码来管理控件行为,随时取值就行了。 然而下拉菜单还提供了大量的函数,可以动态的管理这些元素。

图像容器PictureBox:

PictureBox可以装点你的WInForm,也可以根据需要显示一些图片,让程序看起来跟动态化,互动效果更好。使用PictureBox也十分容易,主要更改其Image属性,这属性属于Image类的。一般需要从程序资源中调取图片,这个会在例子下加以介绍。 【例】显示图片

1 拖拽出一个PictureBox控件 2 右击控件

3 4

单击选择图像

从项目资源文件中导入图片 4.1 单击项目资源文件单选框

4.2

4.3 单击导入 4.4 选择一张图片 4.5 打开

4.6

4.7 单击确定

5 6

图像导入成功了,可以运行看看效果

看看PictureBox.Image属性

这貌似是一个变量名的样子,与工程文件在同一个命名空间中。其实可以找到他。

1 2

在解决方案资源管理器中找到Properties展开

打开Resources.resx(这就是资源文件),它内部是xml文件,与C#代码一起运作,这个机制就比较复杂了。

可以看到刚刚添加的图片就在里面

以后也可以通过这个界面来维护添加的资源,资源不仅可以是图片,也可以是声音,文字

【例】在WinForm初始化时通过代码装载图片 1 拖拽出一个PictureBox

2 按前面的例子向资源文件导入一张图片(此处添加了叫apple的图片) 3 双击窗体进入窗体的Load事件编辑代码 private void Form1_Load(object sender, EventArgs e){ pictureBox1.Image = Properties.Resources.apple; //根据实际添加图片资源名称 } 4 运行看看效果吧 进度条ProgressBar: 掩码文本框MarkedTextBox:

进度条是一个使用起来十分简单的控件主要改变其Maximun、Minimun、Value属性来简单的调整外观视图。

掩码文本框则是通过掩码来确定用户输入特定格式的文字。 下面例子中同时用到两种控件来实现一个比较直观的定时器。 【例】定时器

1 拖拽出一个掩码文本框、一个按钮和一个进度条

2 3 4

修改名字为maskText、btnSet、progressBar 设置maskText.Mask属性选择时间格式

5 6 7

确定——这时掩码文本框的外观已经改变:

设置progressBar.Value属性为100,可看到进度条满格设置progressBar.Enabled属性为False

8 9

在拖拽一个工具箱->组件-> 改名timer

10 设置Form的AcceptButton=btnSet 11 添加全局变量 DateTime dt = new DateTime(), st = new DateTime();

12 双击btnSet以编辑Click事件 private void btnSet_Click(object sender, EventArgs e) { switch (btnSet.Text) { case \: try { dt = (DateTime)maskText.ValidateText(); st = DateTime.Now; timer.Enabled = true; maskText.ReadOnly = true; btnSet.Text = \; } catch { progressBar.Value = 100; timer.Enabled = false; dt = new DateTime(); st = new DateTime(); maskText.ReadOnly = false; this.Text = \; } break; case \: timer.Enabled = false; maskText.ReadOnly = false; btnSet.Text = \; break; } } 13 双击timer,编辑timer.Tick事件 private void timer_Tick(object sender, EventArgs e) { if ((dt - DateTime.Now).TotalMilliseconds >= 200) { progressBar.Value = (int)(((dt - DateTime.Now).TotalMilliseconds / (dt - st).TotalMilliseconds) * 100); this.Text = \ + Math.Round((dt - DateTime.Now).TotalSeconds,2); } else { timer.Enabled = false; MessageBox.Show(\); btnSet.Text = \; dt = new DateTime(); st = new DateTime(); progressBar.Value = 100; this.Text = \; } } 14 运行看看效果。

P.S. 这个定时器可能会提前200ms内报时,前面有一句

if ((dt - DateTime.Now).TotalMilliseconds >= 200) 的判断,提前了200ms以提高稳定性,可以减小后面的值提高定时器精度,但不建议设为0

月历MonthCalendar:

这个控件提供了一个简单的月历

可以通过SelectRange属性来获得选择的日期范围 它可选择多个连续的日期

【例】显示2010年第一季度的节气

1 2 3

设计界面如图

命名月历控件为calendar,静态文本控件命名为info 设置info.Visible=false

4 5 6 { 设置calendar属性如图添加全程变量 修改Form1构造函数

Dictionary dict = new Dictionary(); public Form1() InitializeComponent(); dict.Add(new DateTime(2010, 1, 5), \小寒\); dict.Add(new DateTime(2010, 1, 20), \大寒\); dict.Add(new DateTime(2010, 2, 4), \立春\); dict.Add(new DateTime(2010, 2, 19), \雨水\); dict.Add(new DateTime(2010, 3, 5), \惊蛰\); dict.Add(new DateTime(2010, 3, 21), \春风\); } 7 { 双击calendar编辑DateChanged事件 private void calendar_DateChanged(object sender, DateRangeEventArgs e) string str = string.Empty; info.Visible = dict.TryGetValue(calendar.SelectionStart, out str); info.Text = str; } 8 9 运行

更换不同的日期看看效果,选构造函数中初始化字典变量的日期会在info显示节气

日期选择下拉菜单DateTimePicker:

月历是很方便的日期选择控件,不需要类型转换,也比掩码文本框更人性化,但它占程序的面积过大,这种情况下可使用日期选择下拉菜单,节省面积,需要的时候展开选择日期。他的使用方法与月历控件差不多。这个控件只可以选择一个日期。 【例】显示2010年第一季度的节气

编辑界面如图

命名日期选择下拉菜单为picker,命名静态文本控件info 1 添加全程变量 Dictionary dict = new Dictionary(); 2 修改Form1构造函数 public Form1() { InitializeComponent(); dict.Add(new DateTime(2010, 1, 5), \小寒\); dict.Add(new DateTime(2010, 1, 20), \大寒\); dict.Add(new DateTime(2010, 2, 4), \立春\); dict.Add(new DateTime(2010, 2, 19), \雨水\); dict.Add(new DateTime(2010, 3, 5), \惊蛰\); dict.Add(new DateTime(2010, 3, 21), \春风\); } 3 双击picker编辑DateChanged事件 private void picker_ValueChanged(object sender, EventArgs e) { string str = string.Empty; info.Visible = dict.TryGetValue(picker.Value.Date, out str); info.Text = str; } 4 运行

5 更换不同的日期看看效果,选构造函数中初始化字典变量的日期会在info显示节气

富文本编辑框RichTextBox:

这是一个比TextBox更容易显示多媒体文件的文本框。它默认就是多行文本的。 用它来保存文件也非常方便。 【例】笔记本 1 2 3 4 5

设置Form1.Padding如图

设置Form1.TopMost如图

设置From1.Opacity=80%(此属性是窗体不透明度) 设置Form1.Text如图拖拽富文本编辑框

(留边距) (总在最上)

6 7 { 设置其属性Dock=Fill双击Form1编辑Load事件

private void Form1_Load(object sender, EventArgs e) try { richTextBox1.LoadFile(Application.StartupPath + \); } catch { richTextBox1.SaveFile(Application.StartupPath + \); } } 8 选中Form1

9 找到事件FormClosing10 双击编辑此事件 { richTextBox1.SaveFile(Application.StartupPath + \); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) 11 12 13 14 运行

输入一些文字 关闭程序

再次运行,可以看到文字仍然保留在上面

其原因就在于它在程序关闭时创建了一个文件来保存信息。 保存工程后在下面的路径可以找到这个文件 项目文件夹\\bin\\Debug\\data.rtf

P.S. 这个文件可以用写字板或Word打开

这个控件可以显示多种颜色的文本,可以设定Rtf属性。这是这个文件的实际文本。 【扩展】在上一个例子的基础上显示Rtf属性的变化(必须先完成上一个例子)

15 编辑界面如图

15.1 设置richTextBox1.Dock=None

15.2 添加按钮

15.3 设置button1.Text为 &Highlight 15.4 添加文本框

15.5 设置textBox1.MultiLine=True 15.6 设置textBox1.WordWrap=False 15.7 设置textBox1.ReadOnly=True 15.8 设置textBox1.ScrollBars=Both 15.9 设置Form1.FormBorderStyle=FixedSingle 15.10 重新安排控件位置,直到上图的样子 16 拖拽一个Timer17 设置Enable=True 18 双击timer1

P.S. 前面&用来给首字母加下划线

P.S.允许多行文本 P.S.禁止自动换行 P.S.使其只读 P.S.设置滚动条

P.S.禁止窗体改变大小

19 编辑其Tick事件 private void timer1_Tick(object sender, EventArgs e) { textBox1.Text = richTextBox1.Rtf; } 20 双击button1编辑Click事件 private void button1_Click(object sender, EventArgs e) { richTextBox1.SelectionBackColor = Color.LightBlue; } 21 运行看看效果 22 可以选择一定的文字,点击

,同时注意下面的文本框的变化,其中的代码

就记录了富文本编辑框中文本的颜色等信息。由此实现了不同颜色的显示。

网页浏览器控件WebBrowser:

这个控件提供网页的浏览支持 【例】简单的内嵌搜索 1 编辑界面如图所示

2 3 4 { browser.Navigate(\); } 命名文本框txtKey、按钮为btnSearch、浏览器控件为browser 设置btnSearch.Text为Search

双击Form1编辑代码(为browser设定主页,发生Load后导航到这个网址) private void Form1_Load(object sender, EventArgs e) 5 { 双击btnSearch编辑Click事件 private void btnSearch_Click(object sender, EventArgs e) browser.Navigate(\+txtKey.Text); } 6 运行 7 在txtKey输入一些文字,按旁边的按钮搜索

你会发现输入中文出现乱码,这涉及到URL编码的问题可作如下修改,以支持中文 【扩展】支持中文的搜索(必须完成以上步骤) 8 添加引用集:System.Web

8.1 在解决方案资源管理器中右击引用 8.2 点击添加引用

8.3 向下拉动滚动条,找到System.Web命名空间

8.4 点击确定 9 添加using指令 using System.Web; 10 双击btnSearch修改Click事件 private void btnSearch_Click(object sender, EventArgs e) { browser.Navigate(\ + HttpUtility.UrlEncode(txtKey.Text)); } 11 运行

12 输入一些中文并搜索

列表框ListBox:

列表框可以显示一列信息,可以选择。 【例】计算平均数

1 2 3 { 编辑界面如图

命名文本框text、按钮btnAdd、btnClear、btnCalc、列表框list 双击btnAdd编辑代码

private void btnAdd_Click(object sender, EventArgs e) if (text.Text != string.Empty) { try { list.Items.Add(double.Parse(text.Text)); } catch (FormatException) { } text.Text = string.Empty; } } 4 双击btnCalc编辑代码 private void btnCalc_Click(object sender, EventArgs e){ if (list.Items.Count != 0) { double sum = 0, count = 0; foreach (object o in list.Items) { sum += ((double)o); count++; } text.Text = (sum / count).ToString(); } else text.Text = string.Empty; } 5 { 双击btnClear编辑代码 private void btnClear_Click(object sender, EventArgs e) list.Items.Clear(); }

6 运行

复选列表框CheckedListBox:

复选列表框与列表框相比只是在每个列表项前加了一个复选框,可以用于一些比较情况复杂的场合。

【例】多个定时器

1 2 3 4 5 6 编辑界面如图

并且添加一个和定时器

命名进度条progress、按钮btnAdd和btnDel、掩码文本框mask、复选列表框chklist、定时器timer

设置timer.Interval=200 设置timer.Enable=True 建立新的结构 public struct TimerData{ public DateTime StartTime; public DateTime StopTime; public TimerData(DateTime startTime, DateTime stopTime) { this.StartTime = startTime; this.StopTime = stopTime; } public override string ToString() { double s = Math.Round((StopTime - DateTime.Now).TotalSeconds, 2); string str=\ + StopTime.TimeOfDay; if(s>=60)return str+\+(StopTime - DateTime.Now); else return str+\+s; } } 7 双击btnAdd编辑Click事件 private void btnAdd_Click(object sender, EventArgs e){ try { chklist.Items.Add(new TimerData(DateTime.Now, (DateTime)mask.ValidateText()), true); mask.ResetText(); } catch { } } 8 双击btnDel编辑Click事件 private void btnDel_Click(object sender, EventArgs e){ if (chklist.SelectedItem != null) chklist.Items.Remove(chklist.SelectedItem); } 双击timer编辑Tick事件 private void timer_Tick(object sender, EventArgs e){ chklist.Refresh(); for (int i = 0; i < chklist.Items.Count; i++) { TimerData td = (TimerData)chklist.Items[i]; if ((td.StopTime - DateTime.Now).TotalMilliseconds < 200) { bool t=chklist.GetItemChecked(i); chklist.Items.Remove(td); progress.Value = 0; if (t) MessageBox.Show(\ + td.StopTime.ToString()); } } try { if (chklist.SelectedItem != null) { TimerData td = (TimerData)chklist.SelectedItem; progress.Value = (int)(((td.StopTime - DateTime.Now).TotalMilliseconds / (td.StopTime - td.StartTime).TotalMilliseconds) * 100); } else if (chklist.Items.Count != 0) { TimerData td = (TimerData)chklist.Items[0]; progress.Value = (int)(((td.StopTime - DateTime.Now).TotalMilliseconds / (td.StopTime - td.StartTime).TotalMilliseconds) * 100); } } catch { progress.Value = 0; } } 9 运行

托盘区图标NotifyIcon:

这是一个常用的控件,系统任务栏的最右侧即托盘区(也称通知区)

托盘区图标控件使窗体可以在那里创建一个图标。本节将在上一个例子的基础上加以改进,用托盘区图标的气泡提示代替消息框。 【扩展】气泡提示(必须先完成上一节) 10 拖拽一个托盘区图标 11 命名为icon

12 改变icon.Icon属性: 13 单击右侧的按钮

14 选择合适的图标(*.ico文件)

15 16 17 18 { chklist.Refresh(); for (int i = 0; i < chklist.Items.Count; i++) { 打开,若导入成功如图

设置icon.BalloonTipIcon=Info 设置icon.Text为Timer 修改timer.Tick事件

private void timer_Tick(object sender, EventArgs e) TimerData td = (TimerData)chklist.Items[i]; if ((td.StopTime - DateTime.Now).TotalMilliseconds < 200) { bool t=chklist.GetItemChecked(i); chklist.Items.Remove(td); progress.Value = 0; if (t) { //MessageBox.Show(\改动处 icon.BalloonTipTitle = \; //气泡初始化 icon.BalloonTipText=\ + td.StopTime.ToString(); icon.ShowBalloonTip(2000); } } } try { if (chklist.SelectedItem != null) { TimerData td = (TimerData)chklist.SelectedItem; progress.Value = (int)(((td.StopTime - DateTime.Now).TotalMilliseconds / (td.StopTime - td.StartTime).TotalMilliseconds) * 100); } else if (chklist.Items.Count != 0) { TimerData td = (TimerData)chklist.Items[0]; progress.Value = (int)(((td.StopTime - DateTime.Now).TotalMilliseconds / (td.StopTime - td.StartTime).TotalMilliseconds) * 100); } } catch { progress.Value = 0; } } 19 为Form1.Closing事件添加处理函数(在退出时清除托盘区图标) private void Form1_FormClosing(object sender, FormClosingEventArgs e) { icon.Visible = false; } 20 运行看看效果吧

列表视图控件ListView

树视图控件TreeView

这两个控件效果如图,这两个控件不太常用,实例篇幅也比较长,学习较困难,这里暂不介绍。

工具提示ToolTip:

这个控件比较简单,主要更改Text属性效果如图;如果某个控件有ToolTip属性,只需

将这个属性指向需要的ToolTip控件。这样鼠标悬停与控件上就会显示工具提示。

定制C#TextBox控件中只允许输入数字的解决方法 2008-10-14 17:31

定制C#TextBox控件中只允许输入数字的解决方法 作者:HuLihui

最近看到一些关于TextBox中限制只允许输入数字的博文,结合笔者前段时间修改完善的开源数值文框TNumEditBox控件,介绍一个解决方法。

在定制的TextBox控件中,如果只允许输入数字,需要考虑如下三种情况: 正常按键输入的字符,包括西文、中文字符等 通过键盘快捷键方式贴入的文本,即Ctrl+V操作

通过上下文关联菜单的Mouse操作贴入的文本,即”粘贴“操作

在探讨的同类文章中,多数只考虑了第1种情况,忽略得了第2、3种常见的操作。本文探讨的处理方法核心思路是重载事件OnKeyPress()和两个法ProcessCmdKey()与WndProc(),并把Ctrl+V、关联菜单的Paste操作统一到键盘录入操作中,从而在OnKeyPress()屏蔽掉非数字键。

1、重载键盘事件OnKeyPress()

键盘输入的字符可以通过重载TextBox控件的OnKeyPress()事件处理,见如下代码: ///

/// 屏蔽非数字键 ///

protected override void OnKeyPress(KeyPressEventArgs e) {

base.OnKeyPress(e); if (this.ReadOnly) {

return; }

// 特殊键, 不处理 if ((int)e.KeyChar <= 31) {

return; }

// 非数字键, 放弃该输入 if (!char.IsDigit(e.KeyChar)) {

e.Handled = true; return; } }

2、重载命令键处理方法ProcessCmdKey()

可以在ProcessCmdKey()中捕获快捷键Ctrl+V操作。首先要清除当前的选择文本,然后读取剪切板ClipBoard中的内容,最后通过模拟键盘输入的方式”输入“ClipBoard的内容。需要指出,在ProcessCmdKey()方法中不能使用静态方法SendKeys.Send(),但可以通过控件的

WndProc()方法发送字符消息以达到模拟键盘录入的目的。见如下代码: ///

/// 捕获Ctrl+V快捷键操作 ///

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {

if (keyData == (Keys)Shortcut.CtrlV) // 快捷键 Ctrl+V 粘贴操作 {

this.ClearSelection();

string text = Clipboard.GetText();

for (int k = 0; k < text.Length; k++) // can not use SendKeys.Send {

// 通过消息模拟键盘输入, SendKeys.Send()静态方法不行 SendCharKey(text[k]); }

return true; }

return base.ProcessCmdKey(ref msg, keyData); }

///

/// 通过消息模拟键盘录入 ///

private void SendCharKey(char c) {

Message msg = new Message(); msg.HWnd = this.Handle; msg.Msg = WM_CHAR; msg.WParam = (IntPtr)c; msg.LParam = IntPtr.Zero; base.WndProc(ref msg); }

3、重载消息处理方法WndProc()

可以在定制TextBox控件中创建无内容的上下文菜单对象,从而屏蔽该菜单,方法是在定制控件的构造函数中增加如下代码: public class CustomTextBox: TextBox {

this.ContextMenu = new ConTextMenu(); // 创建无内容菜单对象 }

由于上下文菜单的Paste操作对应Windows的WM_PASTE消息,于是可以在控件的WndProc()方法中捕获该消息,然后获得剪切板ClipBoard中的内容,最后通过SendKeys.Send()方法模拟键盘录入操作。需要注意,这里不能调用前面ProcessCmdKey()中模拟键盘输入函数SendCharKey()。见如下代码: ///

/// 捕获Mouse的Paste消息

///

protected override void WndProc(ref Message m) {

if (m.Msg == WM_PASTE) // 选择上下文菜单的\粘贴\操作 {

this.ClearSelection();

SendKeys.Send(Clipboard.GetText()); // 模拟键盘输入 } else {

base.WndProc(ref m); } }

4、消除选择ClearSelection()、删除字符DeleteText()

还必须分析前面代码中的函数。其中,函数ClearSelection()用以清除当前的选择文本,即清除this.SelectedText;函数DeleteText()则删除当前字符。注意其中的技巧,就是转换Delete键操作为BackSpace操作。此外,DeleteText()函数还需要确定当前的this.SelectionStart值。具体代码如下: ///

/// 清除当前TextBox的选择 ///

private void ClearSelection() {

if (this.SelectionLength == 0) {

return; }

int selLength = this.SelectedText.Length;

this.SelectionStart += this.SelectedText.Length; // 光标在选择之后 this.SelectionLength = 0;

for (int k = 1; k <= selLength; k++) {

this.DeleteText(Keys.Back); } }

///

/// 删除当前字符, 并计算SelectionStart值 ///

private void DeleteText(Keys key) {

int selStart = this.SelectionStart;

if (key == Keys.Delete) // 转换Delete操作为BackSpace操作 {

本文来源:https://www.bwwdw.com/article/zyn7.html

Top