Я знаю, что это старая тема, но такие вещи случаются снова, поэтому я думаю, что мой вклад может пригодиться в будущем.
Emiswelt говорит: «Вам понадобится конструктор без параметров, который вызывает метод InitializeComponent () в каждой из ваших форм».
Это на самом деле не нужно.
Вы можете объявить пользовательский параметризованный конструктор в производной форме и обычно вызывать метод InitializeComponent (также с вызовом пользовательского конструктора). Важно, что ваш конструктор вызывает «InitializeComponent» (для новых элементов управления), а базовый конструктор вызывает «InitializeComponent» (для унаследованных компонентов).
Эта ситуация будет работать во время выполнения, но вы не увидите унаследованные элементы управления в конструкторе Visual Studio.
Чтобы показать все элементы управления во время разработки, вы должны добавить только простой конструктор без параметров в базовом классе.
Например, если ваша база - это форма с кнопкой и двумя переключателями:
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1(string foo)
{
//use "foo" here
InitializeComponent(); //here button and radios will be initialized
}
}
}
Вы можете увидеть это в инструменте проектирования и без проблем избежать пустого конструктора (без параметров).
Форма Form2 теперь унаследована от Form1:
namespace Test
{
public partial class Form2 : Form1
{
public Form2(string foo) : base(foo)
{
//you can use "foo" here even if it is passed to base class too
InitializeComponent();
}
}
}
Нет пустого конструктора, и он будет компилироваться и работать нормально. В rutime ваша Form2 покажет тот же набор элементов управления, что и Form1.
Но ... вы не можете видеть это во время разработки, потому что Visual Studio не может определить, где находится метод InitializeComponent, и отображается ошибка.
Зачем? Потому что где-то в цепочке вызовов должен быть конструктор без параметров.
Решение представляет собой простую модификацию базового класса:
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
public Form1(string foo):base()
{
//use foo here
}
public Form1() //Visual studio designer likes this!
{
InitializeComponent();
}
}
}
Вот и все.