2013-02-22 53 views
1

我在这里遇到了一个复杂的问题。RenderControl不输出子控件HTML

上下文: 我正在编辑一个表单引擎项目,它根据每个请求上的XML定义动态创建它的控件,以使用Aspose.PDF添加PDF生成功能。简而言之,表单引擎作为一组控件,充当表单(文本框,电话号码,日期控件等)的基本功能,每个控件和它的属性都在xml文件中定义,并对应于一个xml架构。现在,当表单完成时,会有一个formRepeater控件,用于检索先前填充的页面并格式化要在Web浏览器中打印的数据。我必须将其替换为生成PDF文件。

我做了什么: 我添加了一个名为GeneratePdf的新的抽象方法,所有的FormControls都必须实现,我为控件容器PreRender事件中的每个控件和子控件调用此方法。该方法会不同,这取决于每个控件,但这里是基本的一个,现在

public override void GeneratePdf(Aspose.Pdf.Generator.Pdf file) 
    { 

     //Add the control HTML in a new section of the PDF File 
     var section = file.Sections.Add(); 
     var sb = new StringBuilder(); 
     var writer = new HtmlTextWriter(new StringWriter(sb)); 
     this.RenderControl(writer); 
     var html = new Aspose.Pdf.Generator.Text(section, sb.ToString()); 
     html.IsHtmlTagSupported = true; 
     section.Paragraphs.Add(html); 
    } 

我的问题: 我成功地检索使用StringBuilder我的控件的HTML,但如果控制作为标准配置ASP.NET控件内部,子控件的HTML不呈现。为什么?

感谢,

回答

2

的RenderControl会使儿童控件的HTML到某人的StringWriter。

但是,http://www.aspose.com/docs/display/pdfnet/Text+Constructor+Overload_3 Aspose Text不会自动为每个子控件创建段。它期望您传递给它的字符串用于单个(和当前)段。

要添加控件的子控件,您需要递归调用/生成每个子控件。所以你需要重构你的代码。