해결 방법이있는 펑키 한 문제가 있지만 가능하면 코드를 비슷하게 유지하려고합니다. 문제는 null 일 수도 있고 없을 수도있는 사용자 컨트롤에 대한 기본 클래스의 특정 변수를 중심으로합니다.WinForm 사용자 정의 컨트롤을 인스턴스화 할 때 기본 클래스가 항상 호출되지 않음
기본적으로 사용자 컨트롤에 기본 폼 속성에 대한 액세스 권한이 있고 기본 폼에서 메서드를 호출 할 수 있도록 기본 폼 클래스의 인스턴스를 가져 오는 단일 기본 클래스를 가진 많은 사용자 컨트롤이 있습니다. 여기에 조각입니다 (this.frmParent는 공개 멤버) : 다음
private void ucBase_Load(object sender, EventArgs e)
{
// Establish the link to the main form.
this.frmParent = FindForm() as frmMain;
}
각 사용자 제어 주이 기본 클래스 :
public partial class ucLiberty : ucBase
그런 다음 기본 폼에, 나는 사용자 정의 컨트롤을 호출 할 수 있습니다 이 같은 어떤 이유로
ucLiberty Liberty = new ucLiberty();
IQDevicePath = Liberty.GetIQDrivePath();
, I는 사용자 제어를 초기화 할 때 (이 경우는 기본 형태의)베이스 클래스에서 frmParent 변수 또는 비 NULL 값으로 채워지지 않을 수있다.
사용자 컨트롤의로드 이벤트가 발생하지 않은 것으로 나타났습니다. CreateControl()이라는 컨트롤의 생성을 강제하기로되어있는 메서드를 발견하고, 디버거에서 실행을 추적했을 때 frmParent를 채우려는 기본 클래스에 도착했을 때 내로드 이벤트가 시작되었습니다. FindForm()은 항상 null이 아닌 값을 반환하지는 않습니다.
나는이 문제가없는 다른 사용자 컨트롤이 있는데, 그 차이점은 일부 사용자 컨트롤에는 자식 컨트롤이 있고 일부 컨트롤에는 자식 컨트롤이 없다는 것입니다. 자식 컨트롤이없는 사람에게는이 문제가 있습니다.
내 해결에 실패하는 사용자 컨트롤 FindForm() 모니터링 할 수 있으며, 해당 사용자 컨트롤의로드 이벤트에, 기본 폼의 생성자를 호출,이 같은으로 값을 할당 :
this.frmParent = new frmMain();
그러나 , 나는 여전히로드 이벤트가 발생하도록 CreateControl()을 호출해야하며, 미래의 유지 관리자에게 다른 동작 요구 사항에 대한 명시 적 지식이 필요하다는 생각이 맘에 들지 않습니다. 다시 말해서, 사용자 컨트롤이 모두 유지 보수를 단순하게 유지하는 것과 같은 방식으로 작동하도록하고 싶습니다.
필자는 코드를 찢어 버리고 사용자 정의 컨트롤의로드 이벤트가 발생하거나 실행되지 않을 때 왜 사용자 컨트롤 기본 클래스에서 FindForm() 호출이 실패하는지 이해할 수 없습니다.
누구든지 이러한 문제를 해결하는 방법에 대한 아이디어가 있습니까? 감사.
나는 VS (InitializeComponent())에 의해 놓여진 것 외에는 사용자 정의 컨트롤 생성자에 아무것도 없다. 사용자 정의 컨트롤에는 컨트롤이없고 코드 만 있습니다. 로드 이벤트는 컨트롤이 인스턴스화 될 때 실행되지 않고 첫 번째 메서드가 호출 될 때 호출되지 않지만 두 번째 메서드가 호출되고 FindForm()이 null을 반환하면 호출됩니다. – MikeMalter