C# 未对System.Windows.Form中的UserControl调用UserControl.OnLoad

C# 未对System.Windows.Form中的UserControl调用UserControl.OnLoad,c#,winforms,C#,Winforms,我有一个ProjectView表单、一个ProjectView、一个项目。由于缺少初始化和数据,ProjectView.OnLoad方法未被调用,并在尝试显示ProjectView表单时导致应用程序崩溃 如何使用Project数据初始化ProjectView对象,即如何调用OnLoad [SmartPart] public partial class ProjectViewForm : Form { public ProjectViewForm() { Initi

我有一个
ProjectView表单
、一个
ProjectView
、一个
项目
。由于缺少初始化和数据,
ProjectView.OnLoad
方法未被调用,并在尝试显示
ProjectView表单时导致应用程序崩溃

如何使用
Project
数据初始化
ProjectView
对象,即如何调用
OnLoad

[SmartPart]
public partial class ProjectViewForm : Form
{
    public ProjectViewForm()
    {
        InitializeComponent(); // gets here
    }

    protected override void OnLoad(System.EventArgs eventArgs)
    {
        System.Diagnostics.Trace.WriteLine(""); // doesn't get here
    }
}

public partial class ProjectView : System.Windows.Forms.UserControl
{
    public ProjectView()
    {
       InitializeComponent();
       ...
    }
    protected override void OnLoad(System.EventArgs eventArgs)
    {
            this._presenter.OnViewReady();
            base.OnLoad(eventArgs);
            ... populate with Project data ...
    }
}
Project
是一个POCO,其数据填充
ProjectView

在ProjectViewForm.Designer.cs中,新的
项目
项目视图
被实例化:

partial class ProjectViewForm
{
    private void InitializeComponent()
    {
        Project project1 = new Project();
        System.ComponentModel.ComponentResourceManager resources = new 
        System.ComponentModel.ComponentResourceManager(typeof(ProjectViewForm));
        this.projectView1 = new ProjectView();
        this.SuspendLayout();

        this.projectView1.SomeComponent1 = null;
        this.projectView1.SomeComponent2 = null;
        ...
        project1.SomeProperty1 = null;
        project1.SomeProperty2 = null;
        ...
        this.Controls.Add(this.projectView1);

        this.ResumeLayout(false);

        }

    private ProjectView projectView1;
}
在控制器中,我有以下代码:

 WorkItem.State["CurrentProject"] = project; // Project to display
 string key = System.String.Concat("ProjectViewForm", project.Id);
 ProjectViewForm projectViewForm = WorkItem.Items.Get<ProjectViewForm>(key);  // calls ProjectViewForm constructor
 if (projectViewForm == null)
 {
     projectViewForm = WorkItem.Items.AddNew<ProjectViewForm>(key);
 }
 else
 {
     projectViewForm.Focus();
 }

 projectViewForm.Enter += ProjectViewForm_Enter;
 projectViewForm.Leave += ProjectViewForm_Leave;

 string formTitle = System.String.Concat (project.Name, " - Status: ", project.ProjectStatusType.Text);
 var info = new Microsoft.Practices.CompositeUI.WinForms.WindowSmartPartInfo();
 info.Location = System.Windows.Forms.Cursor.Position;
 ... yadda yadda yadda ...
 projectViewForm.Dock = System.Windows.Forms.DockStyle.Fill;

WorkItem.Workspaces[Infrastructure.Interface.Constants.WorkspaceNames.WindowsWorkspace].Show (projectViewForm, info);
WorkItem.State[“CurrentProject”]=project;//要显示的项目
string key=System.string.Concat(“ProjectViewForm”,project.Id);
ProjectViewForm ProjectViewForm=WorkItem.Items.Get(键);//调用ProjectViewForm构造函数
if(projectViewForm==null)
{
projectViewForm=WorkItem.Items.AddNew(键);
}
其他的
{
projectViewForm.Focus();
}
projectViewForm.Enter+=projectViewForm\u Enter;
projectViewForm.Leave+=projectViewForm\u Leave;
string formTitle=System.string.Concat(project.Name,“-Status:”,project.ProjectStatusType.Text);
var info=new Microsoft.Practices.CompositeUI.WinForms.WindowSmartPartInfo();
info.Location=System.Windows.Forms.Cursor.Position;
... 雅达雅达雅达雅达。。。
projectViewForm.Dock=System.Windows.Forms.DockStyle.Fill;
WorkItem.Workspaces[Infrastructure.Interface.Constants.WorkspaceNames.WindowsWorkspace].Show(项目视图表单,信息);

你是说,如果你在该用户控件的OnLoad方法中设置了调试停止,它永远不会停止吗?这是正确的。我们不能在我们这边重新创建类似的东西。如上所述,
OnLoad
在控件第一次显示时调用,因此在显示其容器时调用。否则,当容器初始化其控件(或您的代码显式初始化它)时,只调用构造函数。您是否将
ProjectView
添加到表单的
组件
集合中?它不在您显示的
InitializeComponents
中。您是说,如果您在该用户控件的OnLoad方法中放置调试停止,它永远不会停止在那里吗?这是正确的。我们无法在我们这边重新创建类似的内容。如前所述,在控件首次显示时调用
OnLoad
,因此,当显示其容器时。否则,当容器初始化其控件(或您的代码显式初始化它)时,只调用构造函数。您是否将
ProjectView
添加到表单的
组件
集合中?它不在您显示的
初始化组件中。