随笔分类 -  Windows Form控件

探索WinForm,WebForm中语言的特性(主要C#和VB.NET),以及相关这些特性上的问答探讨(包含如何使用某些控件达到某种目的,以及重写控件等)。
摘要:窗体与子线程间通讯方法窗体上的UI默认情况下不允许使用子线程(或者其它非创建控件的UI线程)去控制(这在NET2.0以下是允许的,但是考虑到安全性等问题,从2.0开始就禁止使用这个功能,除非Form的CheckForIllegalCrossThreadCalls=true,不推荐这样使用)。那么怎么... 阅读全文
posted @ 2014-07-31 13:45 Serviceboy 阅读(499) 评论(0) 推荐(0)
摘要:通常的控件大都有KeyDown,KeyPress和KeyUp事件。它们的顺序以及区别在哪里呢?一、顺序:根据MSDN所讲:KeyDown>KeyPress>KeyUp.二、区别:KeyDown和KeyPress很接近,都是在按键按下时候先后发生。KeyUp是放掉某个键之后发生的事件。三、KeyDown和KeyPress:KeyDown的事件中属性是KeyEventArgs,其中包含三个重要属性:1)KeyCode(返回一个Keys的枚举,可以检测除ScrollLock和NumLock之外的其它键值)。2)KeyValue(等同于KeyCode,只不过是int类型)。3)KeyDat 阅读全文
posted @ 2013-05-05 15:53 Serviceboy 阅读(1128) 评论(1) 推荐(2)
摘要:最近MSDN回答一个问题——说如果在TextBox中键入字符,需要智能感知出列表,同时对不存在的单词(没有出现智能感知的)自动显示“Not Found”。 首先想到的是利用TextBox的AutoComplete功能。该功能允许你设置不同形式的AutoComplete智能感知,譬如: 1)AutoCompleteSource:设置感知源头类型(这里是CustomSource)。 2)AutoCompleteMode:设置感知的模式(输入不存在的字符追加,不追加还是同时存在,这里显然不追加)。 3)AutoCompleteCustomSource:设置源头数据(AutoComp... 阅读全文
posted @ 2013-04-30 12:47 Serviceboy 阅读(839) 评论(0) 推荐(1)
摘要:上一章节探讨了如何解决子窗体随父窗体关闭而关闭的“疑难杂症”,本章讨论父子窗体间如何进行数据交互。 一、共享法: 所谓“共享法”,就是父窗体把数据读入到第三方(通常是一个静态类,或是某个共享文件,流等),然后子窗体读取。这种情况一般用于先前“闪屏窗体”需要预先加载配置信息,然后这个配置信息被主窗体所用。此时,“第三方”可以单独抽取成类库的形式被这两个窗体使用,或者单独成立一个模块(VB.NET),或者定义一个静态类(C#)。 二、消息订阅法: .NET中如果要使得两个毫不相干的类相互之间发生某种关系,我们可以使用事件机制。在NET中窗体本身就是“类”的最佳体现,因此自然可以使用事件... 阅读全文
posted @ 2013-04-18 11:12 Serviceboy 阅读(401) 评论(0) 推荐(0)
摘要:在传统的VB6中父子窗体(诸如“闪屏”窗体是“父窗体”加载内容,然后启动自动关闭,启动主窗体,是子窗体)的交互中,我们只需按照这样的逻辑“按部照搬”地书写即可(假设“闪屏”窗体设置为启动窗体):SplashScreen.Close()MainForm.Show() 可惜的是在VB.NET或者C#中却不能这样写——因为这样写的结果是闪屏窗体“一闪而过”,接着啥也不会出现了。 究其原因,是因为NET中一切都是“类”——闪屏窗体是一个类,这个类内部的某个事件内部引用了“主窗体”这个类,并且把它创造出来。现在你突然间关闭了“闪屏”窗体,意味着创建这个“主窗体”的UI线程被终止,自然属于这个类内... 阅读全文
posted @ 2013-04-08 20:12 Serviceboy 阅读(1301) 评论(0) 推荐(2)
摘要:大部分控件你把属性设置成什么,那么预览以及运行的时候自然字体也就是那种类型——比如普通的WinForm程序中,TextBox的字体包含字号、样式等属性……一旦设置了它们,你运行带有此文本框的程序,自然输入的字体样式等也是如此。但是RichTextBox不然——如果你把一个RichTextBox设置成“宋体,二号”或者其它中文字体,那么你运行程序,你会很惊讶的发现输入中文的时候的确是宋体二号,但是输入西文(如英语等),字体就不再是中文字体了,而是Arial或者其它默认的某个国家的西文字体。这是为什么呢?究其原因在于RichTextBox有一个LanguageOption属性,它是一个枚举值(可以 阅读全文
posted @ 2013-03-19 11:39 Serviceboy 阅读(648) 评论(0) 推荐(1)
摘要:在诸如MSDN等论坛中,每个用户默认会根据名字生成唯一不同的头像图片(如果没有上传自己的头像的话)。这个功能是怎么实现的呢?1)需要到某个网站(Avatar)请求获取一个随机图片。2)格式:www.gravatar.com/avatar/HASH?r=PG&s=256&default=identicon数值(可以是MD5)3)HASH的生成(本文主要讨论这个,其余参数可以打开去自行查看参数说明): 3.1)使用MD5CryptoServiceProvider的ComputeHash方法对已经转化成Byte数组的字符串加密。 3.2)然后使用格式化把生成的Byte数组按照十六进制 阅读全文
posted @ 2013-03-10 16:54 Serviceboy 阅读(723) 评论(2) 推荐(0)
摘要:问题的缘起在于有一个学习数据操作的人询问我“BindingNavigator”如何点击“删除”前进行确认。我一开始模拟创建了一个表,然后通过设计器的方式生成了这四类控件,随后拖拽一个Navigator到WinForm上,双击红色叉叉部分,写入一个MessageBox判断用户究竟是否需要取消——显然不起作用。于是反推引发该Delete事件的方法必然是先调用了SQL相关语句删除了当前记录,然后引发了Delete事件,于是兴冲冲地查看BindingNavigator关于Delete的方法,希望可以重写——[C#]private void OnDelete(object sender, EventAr 阅读全文
posted @ 2012-12-01 16:51 Serviceboy 阅读(1123) 评论(0) 推荐(0)
摘要:一次在开发一个3D“点”用户Web控件的时候用了结构体,结果碰到了小问题,先给出代码(核心部分):[C#]namespace CSharp{ namespace CSharp { /// <summary> /// 三维坐标的Struct结构 /// </summary> [TypeConverter(typeof(MyConvertor))] public struct DPoint { private double _x; private double... 阅读全文
posted @ 2012-11-22 12:44 Serviceboy 阅读(401) 评论(0) 推荐(0)
摘要:NET允许不同的命名空间里存在同名的类——“System.Timers.Timer, System.Threading.Timer和Sytem.Windows.Forms.Timer”就是一个很好的例子。那么它们之间有何区别呢?我们这就来分析一下:[1]System.Windows.Forms.Timer:这个Timer是我们最最常见的一个Timer,主要用于一般Windows窗体编程时候的定时使用。(主要的属性:Interval——用于控制每隔多少时间出发一次Tick事件,Enabled——是否立即启动定时器,Tick事件——用于在Interval到时之后触发的行为)。由于该Timer是相对 阅读全文
posted @ 2012-10-20 22:06 Serviceboy 阅读(2622) 评论(8) 推荐(3)
摘要:这个标题有些长,可能一时半会儿无法看懂。不如我们边看代码边说:[C#]namespace ServerControlTest{ [TypeConverter(typeof(ExpandableObjectConverter))] public class Point { [NotifyParentProperty(true)] public double X { get; set; } [NotifyParentProperty(true)] public double Y { get; set; } [N... 阅读全文
posted @ 2012-09-27 15:49 Serviceboy 阅读(1089) 评论(0) 推荐(0)
摘要:WinForm的一些控件具备自绘功能,这就意味着你可以对这些控件进行自绘,起到意想不到的效果。以下控件就是通过一些简单的控件转变过来的——1、横向选项卡:这个“横向”对话框其实是通过一个TabControl进行“方向旋转”、重绘控件项等操作进行实现的。步骤如下:1.1)Alignment:用于控制选项卡的方向(设置为Left)。1.2)SizeMode:用于调整每个选项卡,默认是Normal(非自绘模式),此处应该设置为Fixed(固定模式),则允许自绘。1.3)设置ItemSize(注意每一个选项卡因为是“横向”的,但是这些单元卡的Width或者是Height确实按照原来“竖向”的选项卡进行 阅读全文
posted @ 2012-07-07 14:08 Serviceboy 阅读(1331) 评论(1) 推荐(1)
摘要:信息提示框(MessageBox)是微软NET自带的一个用于弹出警告、错误或者讯息一类的“模式”对话框。此类对话框一旦开启,则后台窗体无法再被激活(除非当前的MessageBox被点击或者关闭取消)。那么如何使用程序模拟鼠标点击这个messageBox(关闭这个MessageBox)呢?答案是你在弹出这个messageBox之前先启用一个定时器,定时器内部不断向窗体发送Enter按钮用于模拟点击MsgBox的内容,同时主程序中弹出模式消息框。代码如下(VS2012 RC 编写):我们假设窗体上就一个Button,点击这个Button将弹出5个msgbox,同时每个msgbox将延时2秒后自动关 阅读全文
posted @ 2012-07-02 16:41 Serviceboy 阅读(1638) 评论(1) 推荐(1)
摘要:有一个MSDN客户提问在WinForm中如何实现拖拽效果——比如在WinForm中有一个Button,我要实现的效果是拖拽这个Button到目标位置后生成一个该控件的副本。其实这个操作主要分成三步走:1)确定被拖拽的对象:这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,同时调用其DoDragDrop——该函数接受两个参数:i)要拖动的数据。ii)拖动的效果(该效果是2“目标位置”所能够接受的效果,是一个枚举值):[C#]Button1.DoDragDrop(Button1, DragDropEffects.Copy || DragDropEffe 阅读全文
posted @ 2012-04-29 14:02 Serviceboy 阅读(12261) 评论(9) 推荐(2)
摘要:把一个DataTable或者某个object集合的数据源绑定到DataGridView中,直接通过DataGridView数据录入需要进行额外的数据验证。数据验证总共分成两个大类:I)类型验证:所谓“类型验证”,就是输入的数据是不是可以(有效)转化成特定的类型(比如字段是int,但是输入确实abc等),这明显不符合要求。默认情况下,直接在绑定的DataGridView输入不符合类型的数据,当切换到下一条信息或者调用EndEdit方法将抛出异常。这很难看,我们可以通过处理DataError来实现强制性输入正确类型,代码非常简单:[C#]namespace WinFormCSharp{ pu... 阅读全文
posted @ 2012-04-10 16:36 Serviceboy 阅读(4239) 评论(0) 推荐(1)
摘要:我们知道如果对DataGridView直接设置数据源进行绑定,并且启用“排序”的话,直接点击列名就可以实现绑定。现在的问题在于如果这个DataGridView没有设定数据源(数据是动态添加的),如何对这样的数据进行排序呢?[C#]public partial class Form1 : Form { DataGridView dv = new DataGridView(); public Form1() { InitializeComponent(); } private void Form1_L... 阅读全文
posted @ 2012-04-10 09:55 Serviceboy 阅读(1889) 评论(0) 推荐(0)
摘要:最近在MSDN上看到一个人提问如何把自定义的Label拖拽到WinForm上的时候,AutoSize自动设置成False。他当时给出的方法是:[C#]class MyLabel : Label{ public MyLabel() { AutoSize = false; }}[VB.NET]Class MyLabel Inherits Label Public Sub New() AutoSize = False End SubEnd Class很简单,思路似乎也正确——因为MyLabel一旦被初始化之后,构造函数应该立即被执行,从... 阅读全文
posted @ 2012-03-16 20:11 Serviceboy 阅读(2356) 评论(1) 推荐(1)
摘要:有一句英语名言——Picutures speak louder than words(图片胜于千言万语)。可见在描述一些细节问题,或者是用语言文字难以让人产生“身临其境”的时候,图片就发挥了其作用。在WinForm中,DataGridView不仅仅是用于显示文字、我们还可以显示图片。本章就和大伙儿讨论DataGridView中嵌入显示图片的问题。一、嵌入式显示:所谓“嵌入式”,就是说把图片单独存放在某个DataTable的字段中(该字段为byte[]类型)然后绑定到对应DataGridView的指定单元格中显示出来,代码大致如下:[C#]public partial class Form1 : 阅读全文
posted @ 2012-03-06 11:14 Serviceboy 阅读(5216) 评论(0) 推荐(1)
摘要:最近有人问到关于如何实现类似Windows系统中时间调整的控件啊(红色部分),比如:一开始我抓耳挠腮想了老半天没有结果,后来在其他人提醒之下想到了DateTimePicker控件,并且做了调整——只要设置几个属性就可以了:1)Format设置为Time。2)ShowUpDown设置为True。但是如果说要增加“日期+时间”的选择怎么办呢?比如实现以下效果:要实现既可以选择时间的下拉框,同时也允许修改日期,做法是我们可以把ShowUpDown=False,同时把Format设置为CustomFormat,继而设定CustomFormat格式为:yyyy年MM月dd日 HH时mm分ss秒。总结:S 阅读全文
posted @ 2012-02-09 13:26 Serviceboy 阅读(1344) 评论(0) 推荐(0)