繁体   English   中英

添加控件以在Ascx中渲染树

[英]Adding controls to render tree in ascx

我有一个这样的用户控件类:

///MyUserControl.ascx.cs
///.......
public partial class MyUserControl
  : UserControl
{
  //....
  public List<HyperLink> Items
  {
    get
    {
      return _Items;
    }
  }
  public string RenderControl(WebControl control)
  {
      StringBuilder sb = new StringBuilder();
      using(StringWriter stringWriter = new StringWriter(sb))
      {
        HtmlTextWriter writer = new HtmlTextWriter(stringWriter);
        control.RenderControl(writer);
      }
      return sb.ToString();
   }
  //....
}

我想添加所有Items以在ascx中渲染树:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyUserControl.ascx.cs" Inherits="MyUserControl" %>
    <%foreach (var item in Items){%>
      <div>
        <%=RenderControl(item)%>
      </div>
    <%}%>

但这是丑陋的解决方案。 有人知道更好的解决方案吗?

您要以编程方式添加的所有控件都需要添加到用户控件的控件集合中,或者向用户控件添加标签,并添加面板控件集合中的每个项目,如下所示:

foreach (var item in Items)
    panel.Controls.Add(item);

由于我认为您正在建立基本的用户控件类,因此可以通过在基本类中添加抽象方法来做到这一点:

protected abstract Control GetParentControl()

该方法将在MyUserControl中定义,并且从该方法继承的任何类都需要重写此方法。 这样,您可以使用此方法返回要将项目添加到的控件,如下所示:

protected void OnLoad(EventArgs e)
{
    var ctl = this.GetParentControl();
    foreach (var item in Items)
        ctl.Controls.Add(item);
}

编辑:或使用这种方法,创建一种方法来绑定到如Repeater的控件。 创建一个抽象的BindItems方法,该方法会将这些项目传递给基类不需要知道的某些基础控件。

HTH。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM