虽然经验都是在不知不觉中形成的,但如果记录下来,应该会在一定程度上加快积累经验的速度。因此,最近在熟悉一个WINFORM程序后台的过程中,重新梳理一下WINFORM的操作技巧,以便有所收获。
1.DateTime myDateTime = DateTime.Parse(myDateTimeValue);将日期和时间的指定字符串表示转换成其等效的DateTime。
5.我们将可能会出错的sql 写在begin try...endtry 之间,若出错,刚程序就跳到紧接着的begin try...endtry 的beign catch...endcatch
6.begin Transaction 可以理解成新建一个还原点。
commit Transaction 提交这个自begin tran开始的修改
rollback Transaction 表示还原到上个还原点。
tabControl1.ItemSize = new Size(0, 1);
设计好之后,将这个控件的位置向上移动,正好让标签栏看不到(被挡住。
8.int.TryParse(string s, out int result),当无法完成转换时,返回false,result置零,而且永远不会抛异常。
当一个地方是从数据库中取出的值,虽然在程序中用字符串存储,但在数据库中确实是整型字段。这时,其实是没有必要用int.TryParse的。因为先前在存入数据库时就验证过了。假使这里抛了异常,也不是这个地方出了错,而应该去输入判定的地方检验。也就是说,这里的异常是不允许抛的,一旦抛出,就说明这个BUG是程序员的责任——先前的输入判定没有做好。
9. 代码中给按钮添加事件。button5.Click += new EventHandler(showMSG);
private void showMSG(object sender, EventArgs e)
{
Button bc = (Button)sender;
MessageBox.Show(bc.Name);
}
10.Winform中的两个TIMER
10.1.System.Windows.Forms.Timer 来自msdn A Timer is used to raise an event at user-defined intervals. This Windows timer is designed for a single-threaded environment where UI threads are used to perform processing. 这句话可以看到这个Timer的事件触发后是运行在UI线程的,如果在这个方法里面执行了耗时任务,则会造成UI界面卡死。
10.2.System.Threading.Timer 来自msdn Provides a mechanism for executing a method on a thread pool thread at specified intervals.这句话可以看到这个Timer事件触发后是运行在后台线程的,也就是说在这个事件触发后,不能访问UI控件。如果要在这个事件里面访问UI控件,必须通过BeginInvoke方法把数据传递到UI线程去执行。
10.3System.Timers.Timer类:定义一个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()方法来启动计时,通过Stop()方法或者Enable=false停止计时。AutoReset属性设置是否重复计时(设置为false只执行一次,设置为true可以多次执行)。Elapsed事件绑定相当于另开了一个线程,也就是说在Elapsed绑定的事件里不能访问其它线程里的控件(需要定义委托,通过Invoke调用委托访问其它线程里面的控件)。
11.窗体的透明设置可以通过 this.TransparencyKey = Color.White; this.BackColor = Color.White;进行设置,同时窗体上的控件是可见的。
12.如果设置了窗体的TOPMOST后,窗体会一直显示在前面,但通过设置原来窗体的失去获取焦点事件来改变其他窗体的该属性,可以实现同步多个窗体同步显示。
13.非顶级窗体无法透明。
14.通过设置窗体的相关属性,可以让该窗体在任务栏不显示。this.ShowInTaskbar = false;
15. 通过判断一个窗体的Focused是否为True可以判断该窗体是否为活动窗体。
16. 解决winform窗体闪烁问题 请在构造函数里面底下加上如下几行:
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
internal static extern int SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);
//开始对控件操作
禁止重绘:SendMessage(禁止重绘的控件.Handle, 11, 0, 0);
//对控件的操作过程
恢复重绘:SendMessage(恢复重绘的控件.Handle, 11, -1, 0);