【发布时间】:2019-01-14 15:10:38
【问题描述】:
我想知道您是否可以在下面帮助我?
我有一个包含多个窗体的项目。这些表单中的大多数将使用相同的方法,因此,我创建了 BaseForm 并从它继承。
一切正常,但是当我在设计器中将几个文本框添加到从 BaseForm 继承的 Form1 时,Visual Studio 开始崩溃。现在我无法打开 Form1 设计器,因为每次执行此操作时 VisualStudio 都会崩溃。
请看下面我的基类和继承自 BaseForm 的 Form1。我做了一些研究,发现很多人建议不要在 Windows 窗体中使用视觉继承。
除了继承还有其他方法吗?还是我做错了什么? baseform和Form1都使用InitializeComponent()是不是有问题?
public partial class BaseForm : Form
{
private List<Form> OpenForms = new List<Form>();
public BaseForm()
{
ListOpenForms();
CloseOpenForms();
this.FormBorderStyle = FormBorderStyle.None;
InitializeComponent();
SetBackroundPicture();
ShowPostionForm();
}
private void ListOpenForms()
{
foreach (Form frm in Application.OpenForms)
{
OpenForms.Add(frm);
}
}
private void CloseOpenForms()
{
foreach (Form frm in OpenForms)
{
if (frm.Text != "MainMenu")
frm.Close();
}
}
private void ShowPostionForm()
{
this.MdiParent = MainMenu.MainForm;
this.Dock = DockStyle.Fill;
this.Show();
}
private void SetBackroundPicture()
{
this.BackgroundImage = global::OMSRoutine.Properties.Resources.BackgroundPlain;
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
}
表格1:
public partial class Form1 : BaseForm
{
public Form2()
{
InitializeComponent();
}
}
【问题讨论】:
-
首先调用初始化组件。
-
不确定您使用该 OpenForms 列表实现了什么。如果您正在尝试关闭所有客户端窗体,则 MDIParent 窗体具有 MDIChildren 集合属性。在 ForEach 循环中修改集合时要小心,事情往往不会顺利进行。反向使用 for 循环来保留集合的索引顺序。
-
我更改了顺序,BaseForm 现在是 InitializeComponent();然后 this.FormBorderStyle = FormBorderStyle.None;但它仍然不断崩溃。我想我应该初始化 Form1 的组件,然后调用 Baseform,但它不能像继承那样工作
-
当你打开派生自
BaseForm的Form1时,BaseForm的构造函数就会运行,这不是你想要的。要详细了解设计师的工作方式,请查看this post。
标签: c# winforms windows-forms-designer