用 Visual Studio 进行 winform 开发的时候,中途不知道干了啥,突然控件全不见了,如图所示:
仅剩下一个窗口
找问题找半天没找出来很是郁闷,最后还好有备份的版本,对比了一下新的和旧的代码,找出问题并恢复了。
为防止以后也遇到这种情况,记录一下。
检查控件是否被删除
打开Form.Designer.cs
的代码,拉到最下面,看是否有添加控件的声明,类似于下面这样。
如果有,再回头查看初始部件方法: InitializeComponent()
中,检查是否 new 了这些控件。
如果都有,控件方面应该没啥问题,至少不是因为控件被删除了。
控件可视性
任选一个控件,检查控件可见性属性是否为 True
如果是True
,可见性方面也没啥问题。
一般如果是所有控件消失,大概率不会是这种可见性的问题。
添加任意控件测试
这里添加了一个按钮控件,发现可以正常显示,运行也并无问题,说明不是 IDE 的问题。
既不是 VS 的问题,也不是控件方面的问题,推测可能是 Form 中的问题。
是否缺失 add 方法
推测是 Form 的问题,继续回到Form.Designer.cs
源文件中,还是找到初始化 InitializeComponent()
方法,不过这次不是找控件相关的初始化操作代码,而是找到你的窗口 Form1
相关的代码。
- 每次添加新的控件,都会在
InitializeComponent()
中生成相应的初始化代码,添加的控件名字注释作为开头,依次生成,所以你可以用ctrl+F
搜索控件名(窗口名)即可。- 当然
InitializeComponent()
中的代码有控件初始化,也有窗口初始化的代码,而一般窗口初始化会在最后一段的代码块中,所以滑动到InitializeComponent()
方法的末尾即可找到窗口(Form)相关的初始化代码片段。
如下图所示,本窗口名Form1
。检查是否缺失了 this.Controls.Add()
相关的方法,这个方法作用是添加控件到指定控件集合。换言之,一般情况下,在窗口中添加了几个控件,这里就会有几个 add 方法,把缺少的补全即可。
如果你使用了tabcontrol
控件,请继续看。
是否使用类似 tabcontrol 的容器控件
如果你使用了类似于tabcontrol
的容器控件,那么上面的this.Controls.Add()
只需一个或两个,并且这两个的参数是panel,tablcontrol之类的容器控件即可。找到你的tabcontrol
控件名作为参数传递到add方法中,你的页面就会重新出现。我这里的控件名是 tabControl1
,添加这行代码后,界面恢复正常。
而你的其他控件(label,button之类的)则被拖动添加到容器的 page 中了,你可以找到 tabControl
相关代码,自行学习与了解。
总结下来:
你的控件布局在Form窗口中,布局的层次类似于这样:
// Form下
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
//...........
你的控件布局在容器中,容器布局在From中,布局的层次类似于这种
// Form 下
this.Controls.Add(this.tabControl1);
// tabControl1下
this.tabControl1.Controls.Add(this.controlPage1);
//controlPage1下
this.controlPage1.Controls.Add(this.label2);
this.controlPage1.Controls.Add(this.button7);
this.controlPage1.Controls.Add(this.label4);
//.............
总结
到这里,我的问题基本解决了,至于那段方法为何突然消失,我也记不清,似乎是因为我添加了一个布局的控件,然后又误删了某行代码,编译运行的时候报错,
我按照建议提示进行修复,之后就成了开头的模样。
此外,VS本身编译生成的时候可能会将自动生成的源码做一定的格式化,也就是这些生成的源码有它的规范(首行注释,余下的都是代码不夹杂注释行)。
经测试,假如我注释该行(如下图),就会将 tabcontrol 消失,出现开头的空白Form窗口,如果我拖动添加新的控件,就会添加到窗口Form中,VS会生成相应的源码,因代码格式化也删除该注释行的代码,生成新的相应的添加控件的代码,注释行将被删除,生成了this.Control.Add(label2)
。
,,,,可能我表述不清,大家可以试试。
最后,如果还有遇到了其他原因,欢迎补充。