Как уже говорили другие, в конструкторе пользовательского элемента управления не должно быть сложной логики.
Теоретически, место для любых сложных инициализаций должно быть обработчиком события Load или OnLoad (). Однако в VS2010 использование события Load элемента управления (или OnLoad ()) недостаточно.
Если ваш UserControl находится в той же сборке, что и форма, которая его использует, и вы хотите просмотреть форму в Designer, VS2010 не только выполняет конструктор UserControl, но также его OnLoad () или Load событие. Кажется, что это не всегда происходит, но когда Дизайнеру нужно перестроить форму.
Так что, если у вас есть какая-то сложная логика или вы используете внешние ресурсы, такие как база данных, она может выдать эту ошибку при открытии Designer для вложенной формы.
Это плохо, потому что использование события Load должно быть правильным местом для этого.
Возможно, вам придется использовать отложенную инициализацию для любых важных ресурсов, которые вы должны инициализировать перед запуском формы.
например:.
public class MyUserControl: UserControl
{
...
private List<MyObject> myObjects = null;
private List<MyObject> MyObjects
{
get
{
if (myObjects == null)
{
// lazy initialisation here
using (var dbContext = new MyVerySpecialDatabaseContext())
{
myObjects = dbContext.MyObjects.ToList();
}
}
return myObjects;
}
}
public MyUserControl()
{
InitializeComponent();
this.Load += new System.EventHandler(this.MyUserControl_Load);
... // more UI initialization, but no complicated logic here
}
private void MyUserControl_Load(object sender, EventArgs e)
{
this.myDataBindingSource.DataSource = MyObjects;
}
}