代码之家  ›  专栏  ›  技术社区  ›  Juri

自定义ASP.net服务器控件-渲染

  •  2
  • Juri  · 技术社区  · 17 年前

    <myCtrl:CollapsiblePanel id="myCollapsiblePanel" runat="server">
       <asp:Label id="lblTest" runat="server" Text="Test Label:"/>
       <asp:TextBox id="txbTest" runat="server"/>
    </myCtrl:CollapsiblePanel>
    

    <div id="myCollapsiblepanel">
       <input type="submit" name="btnExpand" value="Expand/Collapse" id="btnExpand" />
        <div id="pnlContent"> 
           <span id="lblTest">Title:</span> 
           <input name="txbTest" type="text" id="txbTest" /> 
        </div>
    </div>
    

    protected override void OnInit(EventArgs e)
    {
       for (int i = 0; i < base.Controls.Count; i++)
       {
           Control control = base.Controls[i];
           content.Controls.Add(control);
       }
       base.Controls.Clear();
    
       base.Controls.Add(button);
       base.Controls.Add(content);
    }
    

    <div id="myCollapsiblepanel">
       <input type="submit" name="btnExpand" value="Expand/Collapse" id="btnExpand" />
        <div id="pnlContent"> </div>
    </div>
    

    2 回复  |  直到 17 年前
        1
  •  3
  •   Ruslan    17 年前

    这是因为在任何给定时刻,控件只能属于一个父级。当您将一个集合中的控件添加到另一个集合时,它会自动从第一个集合中删除。在您的情况下:

    for (int i = 0; i < Controls.Count; i++)
    {
       //obtain a reference
       Control control = Controls[i];
       //The control is removed from Controls collection 
       //and added to content.Controls. All remaining controls get shifted left.
       //This means that next control will get skipped.
       content.Controls.Add(control);
    }
    

    Control[] controls = new Control[Controls.Count];
    Controls.CopyTo(controls, 0); //create a snapshot of controls
    
    for (int i = 0; i < controls.Length; i++)
        content.Controls.Add(controls[i]);
    

    或使用反向加法:

    Control[] controls = new Control[Controls.Count];
    for (int i = Controls.Count - 1; i >= 0; i--) //walk backwards
        controls[i] = Controls[i];
    
    for (int i = 0; i < controls.Length; i++)
        content.Controls.Add(controls[i]);
    
        2
  •  0
  •   Jason Plank Maksim Kondratyuk    14 年前

    摆弄Controls集合,特别是在Control容器之间删除和交换控件并不总是有效的。

    display:none

    例如

    <myCtrl:CollapsiblePanel id="myCollapsiblePanel" runat="server" Text="Panel title">
       <asp:Label id="lblTest" runat="server" Text="Test Label:"/>
       <asp:TextBox id="txbTest" runat="server"/>
    </myCtrl:CollapsiblePanel>
    

    你可能应该在CreateChildControls重载中创建并应用这个:

    protected override CraeteChildControls() 
    {
        Controls.Add(new LiteralControl("<"+"h1>"+Text+"<a onclick=\"expandPanel\">[+]</a></h1>"));    
        Panel panel=new Panel();
        // add controls in collapsable panel to panel here
        Controls.Add(panel);
    }
    

    <div id="ctl00_etc_myCollapsiblePanel">
       <h1>Panel title <a onclick="expandPanel">[+]</a></h1>
       <div id="childPanel" style="display:none">
          <label id="ctl_00_etc">Test Label</label>
          <input ... />
       </asp:Panel>
    </div>
    

    以及一些jQuery(或类似的)附加到 <a> :

    function expandPanel() {
        $('<%=childPanel.ClientID %>').css('display','block');
    }
    

    当然,所有这些都是伪代码。