Форма падает при использовании визуального наследования - PullRequest
0 голосов
/ 14 января 2019

Мне было интересно, не могли бы вы помочь мне ниже?

У меня есть проект с несколькими формами окон. В большинстве этих форм будут использоваться одни и те же методы, поэтому я создал BaseForm и унаследовал его.

Все работало нормально, но когда я добавил в Form1 несколько текстовых полей в конструкторе, который наследуется от BaseForm, Visual Studio начал падать. Теперь я не могу открыть конструктор Form1, так как VisualStudio вылетает каждый раз, когда я делаю это.

Пожалуйста, смотрите ниже мой базовый класс и Form1, который наследуется от BaseForm. Я провел некоторое исследование и выяснил, что многие люди советуют не использовать визуальное наследование с формами 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();
        }
    }

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Спасибо за ваши ответы. Я исправил свои формы, но обнаружил, что использование наследования в формах Windows, где базовая форма содержит фоновое изображение, не будет работать хорошо.

Проблема в том, что унаследованный код запускается первым, где заданы фон, стиль изменения границ и т. Д.

После выполнения кода из унаследованного класса инициализируется Form1. Когда форма инициализируется, Visual Studio выполняет эту часть кода, которая обрезает фоновое изображение, покрывая только половину экрана. this.ClientSize = new System.Drawing.Size(1082, 509);

0 голосов
/ 14 января 2019

Вместо того, чтобы наследовать ваши формы, вы можете написать методы расширения:

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();

Не знаю, имеют ли смысл предоставленные вами методы, но это другая проблема. Мой код не проверен, но вы поняли ...

...