工作中,我们发现了微软.net WinForm的一个Bug,会导致窗体设计器自动生成的代码失效,这个Bug从.net2.0到最新的.net4.7.2都存在,一直没有解决。最初是我在教学工作中发现的,后来工作的时候该Bug也常现。
- 重现步骤:
使用VisualStudio2013/2015/2017/2019创建一个新的Windows窗体程序(使用C#或者VB.net都可以)
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120112450313-1082518111.png)
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120112515426-1704009839.png)
新建的默认空白的窗体程序,点击运行,可以正常运行:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120113105389-1440666877.png)
这时,我们往窗体拖一个ListView控件,手动添加两列,名称分别为Id/编号、Name/姓名:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120113249541-1667341491.png)
运行程序,报错:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120113336210-1535254266.png)
点击错误详情,他给出提示让人丈二金刚摸不着头脑,姑且认为窗体自动生成的代码有误,删除该行,程序正常运行:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120113449502-923723479.png)
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120113508863-1809451272.png)
可是,一旦对窗体的任何控件进行更改(调整窗体大小,修改窗体属性等),又会导致编译无法通过:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120113607761-1318850327.png)
只好再进设计器代码,删除出错的行。
该Bug在DataGridView中也同样出现:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120113917762-975721066.png)
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120113942518-2084435404.png)
解决方法:
- 联系微软在下个版本中修正Bug;
- 不使用Name作为表格列的名称。
题外话:
微软在给我们带来便利的同时,也带给我们很多的麻烦:)
—————————————————————————————————————————————————————
Bug Part 2:
我们在相同的地方,给Windows控件的Name属性赋值
1.给窗体控件赋值为Name,编译、运行能够通过:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120133833063-2026949388.png)
运行程序,一切正常:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120134001411-981217722.png)
给DataGridView控件赋值,编译,报错了:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120134111621-2185756.png)
2. 感谢Build_Werther提供的情况,这回,我们在相同的地方,把窗体的Name设置成为Program,编译,报错:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120203216660-394610178.png)
我们把DataGridView命名为Program,编译、运行、一切正常:
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120203335709-2132569667.png)
![[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有 [工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有](https://img2020.cnblogs.com/blog/580/202101/580-20210120203545756-1464513999.png)
好,同样都是Windows控件,在同样的地方设置属性,连提示都一样的:“指示代码中用来标识该对象的名称”。一个能用,一个不能用,换一个名字,前面的不能用,后面的又能用了,你说这不是Bug,不是设计上的问题吗?
——“这有两根金条,你告诉我,哪根是高尚的?哪根是龌龊的?”
.net工作札记系列:
[工作札记]01: CS系统中分页控件的制作
[工作札记]02: .Net Winform控件TreeView最简递归绑定方法
[工作札记]03: 微软Winform窗体中设计上的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有
