.Net UserControl, реализующий методы Show и ShowDialog

У меня есть класс BaseControl, делающий почти все, что мне нужно для элементов управления.

Мне удобно реализовать метод void Show и DialogResult ShowDialog из моего управления.

ОБНОВЛЕНИЕ это для удобства, так как я использую свой BaseControls повсюду, и в некоторых случаях я хочу, чтобы можно было показать (показать-диалог) их с помощью самого простого кода...

Вот код метода ShowDialog, метод Show очень похож:

Form ContainingForm = null;
public DialogResult ShowDialog(string title, Control parent) {
  ContainingForm = new Form();
  this.Dock = DockStyle.Fill;
  ContainingForm.Controls.Add(this);
  ContainingForm.Text = title;
  // 
  DialogResult res = ContainingForm.ShowDialog();
  ContainingForm.Close();
  return res;
}

private void Close(DialogResult result) {
  if (ContainingForm != null) {
    ContainingForm.DialogResult = result;
    // original code: form is not closing...
    // ContainingForm.Close();
  }
}
// button on BaseControl closing the control
protected void Button_Click(object sender, EventArgs e) {
  this.Close(DialogResult.OK);
}

Я попробовал подход, предложенный в этом сообщении, поэтому Close в ShowDialog метод. И в оригинальной версии, и в исправленной с использованием поста выше окно не закрывается.

Я читал об отправке сообщения «Закрыть» на ContainingForm, но использование Invoke тоже не сработало.

Кроме того, следует ли ожидать каких-либо других проблем при использовании Show вместо ShowDialog, поскольку форма не блокирует поток пользовательского интерфейса?

Кто-нибудь знает ответ на этот вопрос??


person neggenbe    schedule 21.11.2016    source источник
comment
В чем проблема с Form, который заставил вас попробовать что-то подобное?   -  person Reza Aghaei    schedule 21.11.2016
comment
Класс Form не имеет параметризованного конструктора, поэтому понятно, что здесь происходит: ContainingForm = new Form(parent);   -  person LarsTech    schedule 21.11.2016
comment
Наследование для совместимости с не-winforms проектами...   -  person neggenbe    schedule 21.11.2016
comment
@LarsTech =› Я исправил код, это была опечатка...   -  person neggenbe    schedule 21.11.2016
comment
Если вам нужен ShowDialog пользовательский элемент управления, вместо него можно использовать Form. Также, если вы хотите использовать его как UserControl, установите FormBorderStyle в None и установите его TopLevel в false и используйте его точно так же, как пользовательский элемент управления.   -  person Reza Aghaei    schedule 21.11.2016
comment
@RezaAghaei: это именно то, что я делаю, но я удалил код, чтобы сократить его...   -  person neggenbe    schedule 21.11.2016
comment
Вы используете UserControl, а не Form.   -  person Reza Aghaei    schedule 21.11.2016
comment
Если единственной причиной является потребность в конструкторе параметров, добавьте его :) Используйте обычный элемент управления формы и рядом с его конструктором по умолчанию добавьте новый с вашими параметрами. Код формы — это просто еще один класс, и добавление конструктора параметров не должно отличаться.   -  person Omar Zaarour    schedule 21.11.2016
comment
Я отредактировал вопрос, чтобы подчеркнуть, что это НЕ Form, и я не хочу делать его «формой», а удобной оболочкой для отображения UserControl...   -  person neggenbe    schedule 21.11.2016
comment
В чем именно вопрос? Я пробовал этот код, и он отлично работает на моей стороне.   -  person Kinetic    schedule 21.11.2016
comment
@Kinetic действительно работает, когда я очищаю еще немного кода на своей стороне. ContainingForm.Dispose() действительно решил мои проблемы.   -  person neggenbe    schedule 21.11.2016


Ответы (1)


Как оказалось, следующий код работает:

private void Close(DialogResult result) {
  if (ContainingForm != null) {
    ContainingForm.DialogResult = result;
    ContainingForm.Close();
    ContainingForm.Dispose();
  }
}
person neggenbe    schedule 21.11.2016