HtmlTextWriter解决方案被添加为WebControl

时间:2011-09-07 08:40:31

标签: c# asp.net htmltextwriter

我有一个有效的解决方案,但它不符合客户的质量保证要求。问题是我无法控制WebControls的位置,它们需要相对于这些上面的图表。我怎么看,我需要“编译”sb.ToString()到WebControl中,然后我就可以控制它.Add()。

我需要从这个有效的解决方案出发:

  
    

private void SetTextBoxes()
       {
         TextBox myBox = new TextBox();
         System.Web.UI.WebControls.Label myLabel =                 新的System.Web.UI.WebControls.Label();

    // <table><tr>
    for (int i = 0; i < _module.Values.Count; i++)
    {
        myLabel = new System.Web.UI.WebControls.Label();
        myLabel.Text = _module.Values[i].Text.ToString() + ": ";

        myBox = new TextBox();
        myBox.BorderStyle = BorderStyle.None;
        myBox.ReadOnly = true;
        myBox.Text = _module.Values[i].Value.ToString("n0");

        myBox.Columns = myBox.Text.Length;

        // <td align="center">
        Controls.Add(myLabel);
        Controls.Add(myBox);
        // </td>
    }
    // </tr></table>
}
  

Key是Controls.Add(),因为它与模块化系统相关,涵盖了此代码和其他一些WebControl。

我建议解决方案可能是什么样的。

private string WriteHtml()
{
    StringBuilder sb = new StringBuilder();
    using (StringWriter stringWriter = new StringWriter(sb))
    {
        using (HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter))
        {
            htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Table);
            htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Tr);

            for (int i = 0; i < _module.Values.Count; i++)
            {
                htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Td);

                htmlTextWriter.Write(string.Format("{0}: {1:n0}"
                    , _module.Values[i].Text
                    , _module.Values[i].Value));

                htmlTextWriter.RenderEndTag(); // td
            }
            htmlTextWriter.RenderEndTag(); // tr
            htmlTextWriter.RenderEndTag(); // table
        }
    }

    //Controls.Add(sb.ToString());
    return sb.ToString();
}

1 个答案:

答案 0 :(得分:0)

我解决了几乎相同的任务。这是我的结果:

1)我创建了小辅助方法:

   public static void RenderControl(Control control, HtmlTextWriter response)
        {
            var sWriter = new StringWriter();
            var htmlWriter = new HtmlTextWriter(sWriter);

            control.RenderControl(htmlWriter);

            // Write HTML
            response.WriteLine(sWriter);
            response.Flush();
        }

2)在主要代码中,如果你想要渲染Html,你会做这样的事情:

    StringBuilder sb = new StringBuilder();
    using (StringWriter stringWriter = new StringWriter(sb))
    {
        using (HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter))
        {
          Control control= new YourControlWithTextBox();
          WebControlHelper.RenderControl(control, htmlTextWriter);
          return stringWriter.ToString();
        }
    }

使用此实现,您可以保留SetTextBoxes()。你得到2个版本的相同控件。这有两个巨大的好处: a)代码仍然可读并用asp.net术语描述。 b)你可以在任何需要解决simmilar任务的地方使用WebControlHelper.RenderControl