Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在VS10.NET表单中获取自定义控件的IDesignerHost时出现问题_C#_Visual Studio - Fatal编程技术网

C# 在VS10.NET表单中获取自定义控件的IDesignerHost时出现问题

C# 在VS10.NET表单中获取自定义控件的IDesignerHost时出现问题,c#,visual-studio,C#,Visual Studio,根据,我正试图在设计阶段实现表单的IDesignerHost: private static Form _findForm; protected override void OnCreateControl() { if (_findForm == null) { _findForm = FindForm(); } if (_findForm == null) { throw new Exception("FindForm() returns null.");

根据,我正试图在设计阶段实现表单的IDesignerHost:

private static Form _findForm;
protected override void OnCreateControl()
{
    if (_findForm == null) { _findForm = FindForm(); }
    if (_findForm == null) { throw new Exception("FindForm() returns null."); }

    // NullReference
    //IDesignerHost dh = (IDesignerHost)_findForm.Site.GetService(typeof(IDesignerHost));
    IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost));
    Console.WriteLine(dh == null); // true
    // ...
}
但正如你看到的,我找不到裁判。 我是否需要“:IDesigner”类,或者
OnCreateControl
调用是否提前获取有效引用

更新: 关于评论中的链接:

public override ISite Site
{
    get { return base.Site; }
    set
    {
        Console.WriteLine("Site set"); // Never happens
        base.Site = value;
        if (value == null) { return; }
    }
}

我还尝试在初始化所有内容后处理事件。似乎没有什么有用的


那我怎么才能得到理想的职位呢 最终更新

公认的解决方案是完全相反和错误的:

public override ISite Site
{
    get { return base.Site; }
    set
    {
        base.Site = value;
        if (value == null) { return; }
        IDesignerHost host = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
        if (host != null)
        {
            IComponent componentHost = host.RootComponent;
            if (componentHost is ContainerControl) { ContainerControl = componentHost as ContainerControl; }
        }
    }
}
它应该是这样的getter:

private IDesignerHost _host;
public override ISite Site
{
    get
    {
        if (base.Site != null)
        {
            IDesignerHost host = (IDesignerHost)GetService(typeof(IDesignerHost));
            if (host != null) { _host = host; }
        }
        return base.Site;
    }
    set { base.Site = value; }
}
正如我发现的,getter被触发,直到它最终能够创建一个有效的引用

base.Site //null
base.Site //null
base.Site //null
base.Site //null
base.Site //...
base.Site //finally got a reference - time to grab it! ;)

也许您可以尝试覆盖站点属性。这里是。不,站点也是空的。请参阅更新。
base.Site //null
base.Site //null
base.Site //null
base.Site //null
base.Site //...
base.Site //finally got a reference - time to grab it! ;)