[原创小技巧]WINFORM开发小技巧三则
技巧1,合理使用控件的Tag属性
几乎所有winform控件有都名为object类型的Tag属性,此属性多数情况下用来承载完整的数据源,相当于WEBFORM页面中hidden控件的作用,举个简单的例子
- C# code
textBox1.Text=info.UserName;
上述代码非常简单,将实体的属性赋值给一个文本框,而此实体还有其它属性,文本框无法显示那么多了,不过一会儿其它地方还需要使用实体的其它对象,那此时就可以把该实体直接赋给文本框的Tag属性,类型为object,代码如下:
- C# code
textBox1.Text = info.UserName;textBox1.Tag = info;
这样再次使用实体的时候就可以从控件的Tag属性中取了,如
- C# code
PersonEntity info = textBox1.Tag as PersonEntity;
当然了,也完全可以把info设计为属性,但有时候这样做可能要添加很多这样的属性,此时就是Tag的用武之地了
技巧2,模态窗口使用DialogResult关闭窗口
如下应用场景,需要弹出一个窗口来,其中需要客户输入处理一些数据后返回,代码如下
- C# code
FrmConnection frmConnection = new FrmConnection(); if( frmConnection.ShowDialog() == DialogResult.OK && frmConnection.Info != null ) { frmDataBase.Info = frmConnection.Info; InitializeCustomControl( frmDataBase ); }
在弹出的窗口中,给它自己的DialogResult属性赋值,窗口即会自动关闭,
通常情况自己关闭也可以,不过调用了Close或Dispose方法后,弹出的窗口对象会销毁,此时再调用它的其它属性什么的,会报"无法访问已释放的资源"的异常
技巧3,临时挂起控件更新
同技巧1一样,几乎所有的"容器控件"都有SuspendLayout()方法和ResumeLayout()方法,这两个方法是做什么的呢?
这两个方法在XXX.Designer.cs代码中最常见,就是设计窗体时VS自动生成的代码里,它是临时挂起控件更新,然后修改控件属性,如添加子控件,改变大小等等操作,全部操作完成后再调用ResumeLayout(false)方法,这样将控件"只更新一次"即可,效率上会提高不了,有点像拼接N个INSERT 语句,然后只连接一次数据库执行全部,而不是连接N次,执行N次,效率自然不咋地了,呵呵!
记录学习中的点点滴滴,一次书写,终生享用,人人为我,我为人人
[解决办法]
顶下~~学习了
[解决办法]
jf 学习
[解决办法]
帮顶,学习
[解决办法]
jf 学习
[解决办法]
应该记录,支持
[解决办法]
帮顶 学习
[解决办法]
学习了
[解决办法]
UP
[解决办法]
不错,都是比较使用的技巧,最后一个技巧一直没用过,一会试试
[解决办法]
学习~
[解决办法]
学习
[解决办法]
谢谢LZ分享-.-
[解决办法]
1,3常用到,
在更新listview等控时,也会用到beginupdate()和endupdate(),据说是为了提高效率,有所体会,但是会闪
[解决办法]
jf
[解决办法]
非常好
[解决办法]
学习了!!
------解决方案--------------------
very good!
[解决办法]
1. Tag 不建议过多使用,因为可读性不强,不容易被他人甚至自己理解。使用Tag多在封闭的小环境下使用,应该是极少用。
2. 标准的模式窗口设计确实应该使用 DialogResult 来做为结束。这时候窗口是 Hide() 而不是 Close(),Close()或Dispose()应该由外部调用者触发。
3. 大量实践证明SuspendLayout()和ResumeLayout()并没有起到多大用处,控件多的时候该卡的还是卡,以前查过很多资料,最终还是没什么结果。楼主你觉得这两个方法效果如何呢?
[解决办法]
[解决办法]
常用用,有人把些整理出很好。
[解决办法]
说明一下,模式窗口设计中用 DialogResult 做为结束是一个硬性的设计标准,不能当做是一种技巧。
[解决办法]
[解决办法]
[解决办法]
UP
[解决办法]
顶一下
[解决办法]
[解决办法]
收藏了,呵呵,出来冒个泡
[解决办法]
学习了,顶一下,
[解决办法]
mark
[解决办法]
[解决办法]
- C# code
public partial class Form1 : Form { private DataView dataview; public Form1() { InitializeComponent(); } private class MyTreeNode : TreeNode { public int Id { get; set; } } }
[解决办法]
up,学习~~~
楼主我有个问题,我的一个窗体上有很多控件(二十几个吧),这些控件都是设计的时候拖上去的。在窗体SHOW的时候要很慢才能显示完整个窗体,请问楼主有没有好的办法解决?
[解决办法]
学习啦
[解决办法]
学习中。。
------解决方案--------------------
学习中。。
[解决办法]
好东西啊,学习学习!
[解决办法]
[解决办法]
学习学习
[解决办法]
对于楼主的思想,学习了,谢谢分享,这比纯看书要好多了
[解决办法]
学习中。
[解决办法]
恩,已经常用TEXT显示文本,TAG保存对应的代码
[解决办法]
学习下,,,
[解决办法]
etfgerg
[解决办法]
up
[解决办法]
呵呵,亲自实践证明过SuspendLayout()和ResumeLayout()并没有起到多大用处
[解决办法]
恩 学习了
[解决办法]
jf 学习
[解决办法]
对于2 DialogResult
对DialogResult赋值后,仍然应该写Close
因为对于非模态窗体(.Show出来而不是.ShowDialog出来的),对DialogResult赋值后不会自动关闭窗体,这样存在不一致性。
另外,由于给DialogResult赋值后自动Close是在消息回圈中检查的,所以很多情况下,比如系统一直忙,或多线程,甚至在窗体使用了Timer控件时都会有问题
[解决办法]
mark
[解决办法]
学习。帮顶
[解决办法]
学习!做个记号,好东西。赞同TAG存放实体。当然,重写也是一种办法。
[解决办法]
Mark
[解决办法]
jf study!
[解决办法]
mark
[解决办法]
不是,也许这就叫经验吧!学习了!
[解决办法]
技巧3,临时挂起控件更新
同技巧1一样,几乎所有的"容器控件"都有SuspendLayout()方法和ResumeLayout()方法,这两个方法是做什么的呢?
这两个方法在XXX.Designer.cs代码中最常见,就是设计窗体时VS自动生成的代码里,它是临时挂起控件更新,然后修改控件属性,如添加子控件,改变大小等等操作,全部操作完成后再调用ResumeLayout(false)方法,这样将控件"只更新一次"即可,效率上会提高不了,有点像拼接N个INSERT 语句,然后只连接一次数据库执行全部,而不是连接N次,执行N次,效率自然不咋地了,呵呵
我现在也被这第三个闪动的情况深深困扰,真是烦啊,目前还是没有完美的解决方法。
[解决办法]
学习了 谢谢~!
[解决办法]
学学
[解决办法]
学学
[解决办法]
支持一下!!!!
[解决办法]
好啊 不错 定下
------解决方案--------------------
XUEXI
[解决办法]
学习了 谢谢~!
[解决办法]
学习中,值得顶
[解决办法]
见识了
[解决办法]
嗯,经常用倒TAG,因为我想不除别的什么好办法传值嘿嘿
[解决办法]
顶了再学
[解决办法]
接分
[解决办法]
值得收藏
[解决办法]
很好,学习了
[解决办法]
[解决办法]
收藏~
[解决办法]
学习了
[解决办法]
学习!
[解决办法]
mark!~
study
[解决办法]
学习了!!
[解决办法]
没怎么做过winform开发,学习下了
[解决办法]
mark
[解决办法]
学习了,顶起来。
[解决办法]
顶下~~学习
[解决办法]
要是人人都象楼主,这个世界该是多美好啊
[解决办法]
[解决办法]
学习 收藏 然后顶上去
[解决办法]
ding
[解决办法]
支持下 支持原创
[解决办法]
嗯,学习了.谢谢楼主.
[解决办法]
学习up
[解决办法]
up,值得学习
[解决办法]
学习(100楼???)