В моем приложении я использую одну и ту же winform в разных контекстах для управления видимостью кнопок, включения текстовых полей и текста заголовка winform. Я решил сделать это, просто передав строку в конструктор формы и проверив ее с помощью пары операторов if, которые, в свою очередь, содержат желаемые настройки winform.
if (formContext == "add")
{
Text = "Add member";
}
if (formContext == "edit")
{
Text = "Change role";
userTextBox.Enabled = false;
searchButton.Visible = false;
}
Это работает нормально, однако ключевые слова «Текст» получают синюю волнистую линию, добавленную ReSharper со следующим сообщением: Вызов виртуального члена в конструкторе. Это потенциальная проблема или просто какое-то излишне восторженное сообщение ReSharper.
Будем очень признательны за любые разъяснения или предложения по улучшению моей реализации.





Вызов виртуального члена в ctor базового класса мог вызывает выполнение некоторой логики в подклассе до того, как вызывается ctor подкласса (и, таким образом, до того, как объект получит возможность инициализировать себя до согласованного состояния).
Это просто приятное напоминание, чтобы вы знали, что делаете что-то, что потенциально может вызвать неприятное неожиданное поведение.
Вы имеете в виду предложения помимо того, что просто не вызываете виртуальные методы в вашем базовом классе ctor? :-) В этой ситуации вы можете использовать привязку данных для привязки свойства Text формы к строковому полю в классе модели GUI, которое затем будет содержать необходимую логику для определения того, что должна говорить строка заголовка.
Да ... Возможно, я мог бы, хотя я не знал, с чего начать, и, думаю, мне пришлось бы сделать то же самое для кнопки и текстового поля.
В дополнение к существующим ответам для форм вы можете добавить обработчик события Load:
Load += delegate
{
if (formContext == "add")
{
Text = "Add member";
}
if (formContext == "edit")
{
Text = "Change role";
userTextBox.Enabled = false;
searchkButton.Visible = false;
}
};
Это кажется самым простым и лучшим решением того, что я пытаюсь выполнить, без необходимости переписывать много кода. Да ... мне лень: P
Я бы посоветовал вам переписать класс следующим образом:
public partial class Form1 : Form
{
public enum FormContextMode
{
Add,
Edit
}
private FormContextMode m_mode = FormContextMode.Add;
public Form1( FormContextMode mode )
{
InitializeComponent();
m_mode = mode;
Load += delegate { UpdateForm(); };
}
private void UpdateForm()
{
if ( m_mode == FormContextMode.Add )
{
Text = "Add member";
}
else if ( m_mode == FormContextMode.Edit )
{
Text = "Change role";
userTextBox.Enabled = false;
searchkButton.Visible = false;
}
}
}
Вам не нужно подписываться на собственное событие Load, просто переопределите метод OnLoad.
Да, я согласен с Ильей - лучше перегрузить метод, тогда вам не нужно будет помнить об отказе от подписки на событие + (и это интуитивное заявление), вероятно, быстрее.
Не создавайте «второй ответ», это просто сбивает с толку. Этот ответ сам по себе не соответствует требованию «Любые разъяснения или предложения по улучшению» в вопросе.
Исходный ответ удален и заменен этим, обновленным, как показано.
Просто запечатайте свой класс.
Да ... об этом я и сам думал. Любые предложения относительно того, как я мог бы сделать это лучше. Стабильность - приоритет номер один в этом проекте, и я бы предпочел избегать возможного неожиданного поведения.