Như những người khác đã nói, bạn không nên có bất kỳ logic phức tạp nào trong hàm tạo của điều khiển người dùng.
Về lý thuyết, nơi để thực hiện bất kỳ khởi tạo phức tạp nào là trình xử lý sự kiện Load hoặc OnLoad(). Tuy nhiên, trong VS2010, sử dụng sự kiện Load của điều khiển (hoặc OnLoad()) là không đủ.
Nếu UserControl của bạn đang ở trong cùng một cụm như biểu mẫu đang sử dụng nó và bạn muốn xem biểu mẫu trong Nhà thiết kế, VS2010 không chỉ thực thi hàm tạo của UserControl, mà còn là OnLoad() hoặc Tải sự kiện. Điều này dường như không xảy ra luôn, nhưng khi Nhà thiết kế cần xây dựng lại biểu mẫu. Vì vậy, nếu bạn có bất kỳ logic phức tạp nào hoặc sử dụng tài nguyên bên ngoài, như cơ sở dữ liệu, nó có thể ném lỗi này khi mở Trình thiết kế cho biểu mẫu kèm theo. Điều này là xấu vì việc sử dụng sự kiện Tải phải là nơi thích hợp để thực hiện.
Bạn có thể phải sử dụng khởi tạo lười biếng cho bất kỳ tài nguyên quan trọng nào mà bạn phải khởi tạo trước khi chạy biểu mẫu.
ví dụ .:
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;
}
}
Nguồn
2014-07-07 23:45:27
Hiển thị mã cho chúng tôi và chỉ dòng thông báo lỗi xuất hiện. –
Sao chép tất cả các lỗi văn bản từ desiner và dán nó ở đây;) – serhio