Наследование Winform и размер формы по умолчанию - PullRequest
4 голосов
/ 12 февраля 2010

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

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

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

Я подозреваю, что ваша проблема связана с тем, что вы используете конструктор форм 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:
        ...
    }
}
0 голосов
/ 12 февраля 2010

Почему бы не сделать так, чтобы 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;
    }
}

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

0 голосов
/ 12 февраля 2010
public partial class derivedForm : baseForm
{
    public derivedForm()
    {
        InitializeComponent();

        this.Width = base.Width;
        this.Height = base.Height;
    }
}
...