Форма наследования в C # - PullRequest
       12

Форма наследования в C #

1 голос
/ 14 января 2010

У меня следующая проблема: у меня есть базовая форма с панелью, пристыкованной к нижней части, и внутри панели несколько кнопок. Формы, наследующие эту базовую форму, могут изменять видимость кнопок базовой формы с помощью таких свойств, как «ButtonCloseVisiblity», которые отображаются в свойствах дочерней формы. Проблема заключается в том, что иногда, когда дочерняя форма обновляется (например, когда я дважды щелкаю событие, удаляю вновь созданное событие в коде и возвращаюсь в конструктор), видимость кнопок снова устанавливается в состояние по умолчанию.

Ответы [ 6 ]

2 голосов
/ 14 января 2010

Скорее всего, это связано с отсутствующим атрибутом в базовом свойстве. Взгляните на эту страницу MSDN , в частности DesignerSerializationVisibilityAttribute.

1 голос
/ 11 февраля 2010

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

public bool ControlVisibility
{
    get{ return control.Visibility; }
    set{ control.Visibility = value; }
}

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

private bool _controlVisibility;

public bool ControlVisibility
{
    get{ return _controlVisibility; }
    set
    { 
        _controlVisibility = value;
        control.Visibility = value;
    }
}

Таким образом, свойство сохраняется в коде.

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

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

Когда я исследовал проблему, ответ MS, казалось, заключался в том, что это было слишком сложно реализовать должным образом и что у них не было планов ее исправить! Мне кажется, что во многом это зависит от генерации кода в дочернем контроле, а не от истинного наследования.

Кстати, DesignMode подходит для элемента управления непосредственно в форме, но НЕ надежен, если у вас есть элемент управления на элементе управления или какая-либо более глубокая иерархия. В какой-то момент в прошлом году я сделал сообщение или ответ об этом здесь.

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

Не уверен, что если я полностью понимаю, но мне кажется, что значение свойства видимости перезаписывается? Если вы измените это вручную в файле конструктора, значение будет перезаписано при следующем обновлении файла конструктора (например, при добавлении нового элемента управления).

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

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

Да, это очень часто случается в Visual Studio. Сохраните свои изменения в конструкторе дочерней формы или внесите их в OnLoad (). Вы также можете добавить следующую проверку, если вы не хотите, чтобы изменения были видны в дочерней форме в режиме конструктора.

   if(!DesignMode){
    ....
   }
0 голосов
/ 14 января 2010

Я использовал унаследованные формы, но не с элементами управления на них.

Извините, если вы уже попробовали это.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...