一部分的系列控制我的工作显然涉及我混为一谈的一些它们一起在对复合材料。我迅速开始学习,这需要审议(这是所有新的给我!) :)

我基本上有一个 StyledWindow 控制,这基本上是一个荣耀的 Panel 有能力这样做的其他位(增加边界等等)。

这里的代码实例的儿童的控制内。直到这一点似乎已经正常工作与世俗的静态控制:

    protected override void CreateChildControls()
    {
        _panel = new Panel();

        if (_editable != null)
            _editable.InstantiateIn(_panel);

        _regions = new List<IAttributeAccessor>();
        _regions.Add(_panel);
    }

问题来了今天,当我试过套更复杂的控制内。这种控制使用一个参照的一页,因为它注入JavaScript在使这一点更加清脆的响应(该 RegisterClientScriptBlock 是唯一的原因,我需要页面ref)。

现在,这是造成"对象null"的错误,但我本地化的这个下降到所呈现的方法,其实是试图呼叫的方法对[空] Page 对象。

什么混乱我的是,控制正常工作作为一个独立的,但是,当放置在 StyledWindow 这一切是可怕的错误!

因此,它看起来像我失去了一些东西在我的 StyledWindowChildControl.任何想法?

更新

作为 布拉德*威尔逊 非常正确地指出,你看不到控制正在加入的 Controls 收集。这是什么 _panel 是的,这是有处理这对我来说,基本上复盖然后 Controls (我得到了这一指南的某个地方):

    Panel _panel;    // Sub-Control to store the "Content".
    public override ControlCollection Controls
    {
        get
        {
            EnsureChildControls();
            return _panel.Controls;
        }
    }

我希望这有助于澄清东西。道歉。

更新以下 Longhorn213的答案

好,我们做了些玩的控制,放置一个内的复合和一个外。然后我得到的状态页上,在事件重大事件在控制生命周期和呈现它的网页。

独立工作正常和页面是inited如预期的那样。然而,一种嵌套的复合不同。它的 OnLoad 事件不是被解雇了!所以我猜布拉德可能是对的在于我不设置了控制层级正确,任何人都可以提供一些建议为我的失踪?是小组的方法不够吗?(嗯,这显然不是吗?!) D

谢谢你的帮助们认识到:)

有帮助吗?

解决方案 3

解决了!

对,我确定得到这种破裂的今天!这里是我的想法:

  • 我以为使用 Panel 是黑客的,所以我应该删除它,并找出它是如何真正做到的。
  • 我不想要做这样的事情 MyCtl.Controls[0].Controls 访问控制添加到合成。
  • 我想这该死的东西去工作!

所以,我有搜索和打 MSDN, 这artcle真的 有用的(即像几乎复制'n'贴,并解释说好的东西MSDN是传统上不良)。好!

因此,我扯出来的使用 Panel 和很多其后的artcle,并把它作为福音制作笔记,因为我去了。

这里就是我现在有:

  • 我了解到我使用了错误的期限。我应该已经调用这一个 模板的控制.虽然模板的控制是技术上的复合材料,有明显的差异。模板的控制可以界定所接口的项目被添加到他们。
  • 模板的控制是非常强有力的和实际上相当快的和容易设定一旦你得到你的头轮他们!
  • 我会玩一些更有设计师的支持,以确保我完全理解这一切,然后得到一篇博客了:)
  • 一个"模板"控制用于指定的接口模板数据。

例如,这里是ASPX标记为一个模板的控制:

<cc1:TemplatedControl ID="MyCtl" runat="server">
    <Template>
        <!-- Templated Content Goes Here -->
    </Template>
</cc1:TemplatedControl>   

继承人的代码,我们现在

public class DummyWebControl : WebControl
{
    // Acts as the surrogate for the templated controls.
    // This is essentially the "interface" for the templated data.
}

中。.cs...

    ITemplate _template;
    // Surrogate to hold the controls instantiated from 
    // within the template.
    DummyWebControl _owner;

    protected override void CreateChildControls()
    {
        // Note we are calling base.Controls here
        // (you will see why in a min).
        base.Controls.Clear();
        _owner = new DummyWebControl();

        // Load the Template Content
        ITemplate template = _template;
        if (template == null)
            template = new StyledWindowDefaultTemplate();
        template.InstantiateIn(_owner);

        base.Controls.Add(_owner);
        ChildControlsCreated = true;
    }

然后,提供易于访问的控制的[代理]对象:

(这是为什么我们需要明确/加入的基础。控制)

    public override ControlCollection Controls
    {
        get
        {
            EnsureChildControls();
            return _owner.Controls;
        }
    }

并且那是很多,轻松时你知道如何!:)

下: 设计次区域的支持!

其他提示

我没有看到你在任何地方将控件添加到Controls集合,这可以解释为什么他们无法访问页面(因为他们从未正式放在页面上)。

我总是把JavaScript调用放在OnLoad函数上。如下。

protected override void OnLoad(EventArgs e)
{

    // Do something to get the script
    string script = GetScript();

    this.Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "SomeJavaScriptName", script);

    // Could also use this function to determine if the script has been register. i.e. more than 1 of the controls exists
    this.Page.ClientScript.IsClientScriptBlockRegistered("SomeJavaScriptName");

    base.OnLoad(e);
}

如果您仍想进行渲染,那么您只需在响应中编写脚本即可。这就是RegisterScriptBlock所做的,它只是将脚本内联在页面上。

是的,我玩了,我认为我的控件实例化有问题,因为Longhorn是对的,我应该能够在 OnLoad 创建脚本引用(我不能) ,Brad是正确的,我需要通过添加到组合的 Controls 集合来确保我的 Controls 层次结构。

所以,我在这里有两件事:

  1. 我已经覆盖复合的 Controls 属性访问器,以返回此 Panel 的Controls集合,因为我不想去 ctl.Controls [ 0] .Controls [0] 进入我想要的实际控制。 我删除了这个,但我需要对此进行排序。
  2. 我没有将 Panel 添加到 Controls 集合中,我现在已经这样做了。
  3. 所以,现在它可以正常工作,如何获取复合的 Controls 属性以返回 Panel 中的项目,而不是<代码>面板本身?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top