使用视觉继承时表单崩溃

时间:2019-01-14 15:10:39

标签: c# winforms windows-forms-designer

我想知道您是否可以在下面帮助我?

我有一个带有多个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();
        }
    }

3 个答案:

答案 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也可能崩溃。