我想知道您是否可以在下面帮助我?
我有一个带有多个Windows窗体的项目。这些表格大多数都将使用相同的方法,因此,我创建了BaseForm并从中继承了该表格。
一切正常,但是当我在从BaseForm继承的Form1中向Designer添加一些文本框时,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;
}
Form1:
public partial class Form1 : BaseForm
{
public Form2()
{
InitializeComponent();
}
}
答案 0 :(得分:0)
您可以编写扩展方法来代替继承表单:
public static class FormExtension
{
public static InitializeForm(this Form form)
{
form.ListOpenForms();
}
public static void ListOpenForms()
{
foreach (Form frm in Application.OpenForms)
{
OpenForms.Add(frm);
}
}
}
并且在调用MyForm1
的构造函数时(以前是从BaseForm
继承的):
this.InitializeForm();
不知道您提供的方法是否有意义,但这是另一个问题。我的代码未经测试,但是您知道了...
答案 1 :(得分:0)
谢谢您的回答。我修复了表单,但发现在包含基础图片的基本表单的Windows表单上使用继承不能很好地工作。
问题是继承的代码首先在设置背景,更改边框样式等的地方运行。
从继承的类执行代码后,将初始化Form1。初始化表单后,Visual Studio会执行这部分代码,以修剪仅覆盖屏幕一半的背景图片
this.ClientSize = new System.Drawing.Size(1082, 509);
答案 2 :(得分:0)
对于其他遇到此问题的人,请参见另一个问题:
Visual studio crashes when opening forms inheriting from a specific form in the project
如果您的基本表单中有一个Timer
,并且执行的代码使用了一些未公开的成员,VS也可能崩溃。