首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[原创小技巧]WINFORM开发小技巧三则解决思路

2011-12-31 
[原创小技巧]WINFORM开发小技巧三则技巧1,合理使用控件的Tag属性几乎所有winform控件有都名为object类型的

[原创小技巧]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()并没有起到多大用处,控件多的时候该卡的还是卡,以前查过很多资料,最终还是没什么结果。楼主你觉得这两个方法效果如何呢?
[解决办法]

引用楼主 kkun_3yue3 的帖子:
记录学习中的点点滴滴,一次书写,终生享用,人人为我,我为人人

[解决办法]
常用實用,有人把這些整理出來很好。
[解决办法]
说明一下,模式窗口设计中用 DialogResult 做为结束是一个硬性的设计标准,不能当做是一种技巧。
[解决办法]
探讨

1. Tag 不建议过多使用,因为可读性不强,不容易被他人甚至自己理解。使用Tag多在封闭的小环境下使用,应该是极少用。

2. 标准的模式窗口设计确实应该使用 DialogResult 来做为结束。这时候窗口是 Hide() 而不是 Close(),Close()或Dispose()应该由外部调用者触发。

3. 大量实践证明SuspendLayout()和ResumeLayout()并没有起到多大用处,控件多的时候该卡的还是卡,以前查过很多资料,最终还是没什么结果。楼主你觉得这…

[解决办法]
探讨
引用:
1,3常用到,
在更新listview等控时,也会用到beginupdate()和endupdate(),据说是为了提高效率,有所体会,但是会闪


其实还有个简单办法,就是先设置listview的Visiable=false,然后调用SuspendLayout方法,
再然后调整listview的各个属性,完毕后调用ResumeLayout(false)方法,最后再设置listview的Visiable=true,
这样的效果是"卡"一下,但不会闪,为了不卡,还可以把上述所有操作放到子线程里…

[解决办法]
UP
[解决办法]
顶一下
[解决办法]
探讨

怎么说呢,不仅仅上述三个技巧,所有的"实现方法"都有"最适合使用"的场景,在最适合使用某技术的场景中使用就是最好的解决方案,相反就不是了,
1,在最适合使用它的上下文中使用就非常好,过度使用,强行使用效率不佳,举个适合使用它的场景,如TreeView中的TreeNode的Tag可以设置为实体对象,这要在TreeView的事件e里可以找到Node,继而可以从其Tag中获取到实体对象,对这种方法对应的别一种方法,如写一个 Dictionary <string,实体>来保存,在使用的时候根据TreeNode的Name或Text到字典里遍历获取以好得多,您觉得呢?

[解决办法]
收藏了,呵呵,出来冒个泡
[解决办法]
学习了,顶一下,
[解决办法]
mark
[解决办法]
探讨
引用:
这种场景不适合用Tag,代码的可读性太差。最佳做法是重写 TreeNode,扩展你所需要的属性,在TreeView中添加你自己的TreeNode,重写一个TreeNode代码量顶多10多行,换来的好处是非常好的可读性和扩展性。


那Tag什么时候适用呢?因为几乎所有WINFORM控件都有Tag属性,使用到的全部重写?显然也不太好~您觉得呢?

[解决办法]
C# code
    public partial class Form1 : Form    {        private DataView dataview;        public Form1()        {            InitializeComponent();        }        private class MyTreeNode : TreeNode        {            public int Id { get; set; }        }    }
[解决办法]
up,学习~~~
楼主我有个问题,我的一个窗体上有很多控件(二十几个吧),这些控件都是设计的时候拖上去的。在窗体SHOW的时候要很慢才能显示完整个窗体,请问楼主有没有好的办法解决?
[解决办法]
学习啦
[解决办法]
学习中。。
------解决方案--------------------


学习中。。
[解决办法]
好东西啊,学习学习!
[解决办法]

探讨


1. Tag 不建议过多使用,因为可读性不强,不容易被他人甚至自己理解。使用Tag多在封闭的小环境下使用,应该是极少用。

2. 标准的模式窗口设计确实应该使用 DialogResult 来做为结束。这时候窗口是 Hide() 而不是 Close(),Close()或Dispose()应该由外部调用者触发。

3. 大量实践证明SuspendLayout()和ResumeLayout()并没有起到多大用处,控件多的时候该卡的还是卡,以前查过很多资料,最终还是没什么结果。楼主你觉得…

[解决办法]
学习学习
[解决办法]
对于楼主的思想,学习了,谢谢分享,这比纯看书要好多了
[解决办法]
学习中。
[解决办法]
恩,已经常用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楼???)

热点排行