Наследование Winform и размер формы по умолчанию

Приложение, над которым я работаю, будет иметь несколько форм с большим количеством общих функций. Например, каждая форма будет иметь DataGridViewмного одинаковых кнопок, много одинакового пользовательского интерфейса и так далее.

Я хотел бы реализовать это, создав базовую версию этой общей формы, разделив ее на подклассы для всех этих очень похожих, но не совсем одинаковых дочерних форм, и добавив все необходимые дополнительные элементы управления и функции для каждой из них. из них.

Я уже понял, что это помогает сделать элементы управления базовой формы protected потому что это позволяет таким вещам, как закрепление, работать должным образом. Однако мне еще предстоит найти способ автоматически сделать производные формы того же размера, что и базовая форма.

Опыт подсказывает мне, что должен быть простой способ сделать это. Несмотря на то, что не составляет большой проблемы просто ввести необходимый размер вручную для каждой производной формы сразу после ее создания, я бы предпочел сделать все максимально чистым, простым и автоматическим.

3 ответа

Решение

Мне интересно, что ваши производные формы не наследуют размер автоматически от их базовой формы, потому что это должно работать без необходимости что-либо с этим делать.

Предполагаемая причина вашей проблемы:

Я подозреваю, что ваша проблема связана с тем, что вы используете конструктор форм Visual Studio для редактирования форм. Каждый раз, когда вы редактировали форму, Windows Forms Designer генерирует необходимый код в InitializeComponent метод ваших форм. Среди всего сгенерированного кода есть назначения, которые устанавливают размер формы, даже если он идентичен размеру базовой формы. Поэтому вам, возможно, придется вручную закомментировать эти назначения, если вы хотите, чтобы ваша производная форма имела такой же размер, что и базовая форма, даже если вы изменили размер базовой формы после создания производных форм. (Однако я не знаю, может ли это привести к дальнейшим проблемам с позиционированием и расположением элементов управления.)

// Code to be commented out in your derived form's InitializeComponent method:
this.AutoScaleDimensions = new System.Drawing.SizeF(...);
this.ClientSize = new System.Drawing.Size(...);

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

Обходное решение:

Вы можете сделать следующее, чтобы вам не приходилось вручную комментировать сгенерированный дизайнером код каждый раз, когда вы редактировали форму:

Создайте форму, полученную из вашей базовой формы; давай называть это FrozenBaseForm, Вы будете получать все другие формы из этого класса, а не непосредственно из базовой формы. Теперь в этом "промежуточном" классе вы определяете новое свойство ClientSize:

public class FrozenBaseForm : BaseForm
{
    new public SizeF ClientSize
    {
        get { return base.ClientSize; }
        set { }
    }
}

Это вызовет все назначения ClientSize не иметь никакого эффекта и, следовательно, сохранить размер от базовой формы. Это похоже на хак, чтобы сказать правду, но это похоже на работу. Возможно, вам придется скрыть Size собственность таким же образом, кстати.

Как сказано, выведите свои формы из FrozenBaseForm вместо от BaseForm непосредственно:

public class DerivedForm1 : FrozenBaseForm { ... }
public class DerivedForm2 : FrozenBaseForm { ... }
...

Другой вариант (в крайнем случае, если ничего не помогает):

В крайнем случае, вы можете просто забыть о Forms Designer и просто определить производные формы вручную в редакторе кода (хотя я лично не хотел бы делать это):

public class DerivedForm : BaseForm
{
    public DerivedForm()
    {
        // make all necessary changes to the base form:
        ...
    }
}

Почему бы не сделать так, чтобы BaseForm сам устанавливал размер?

public partial class BaseForm : Form
{
    public BaseForm()
    {
        InitializeComponent();

        // you could hardcode these or retrieve these values from a
        // config file or something
        this.Width = 640;
        this.Height = 468;
    }
}

Разве это не делает то, что вы хотите?

public partial class derivedForm : baseForm
{
    public derivedForm()
    {
        InitializeComponent();

        this.Width = base.Width;
        this.Height = base.Height;
    }
}
Другие вопросы по тегам