我有一个有效的解决方案,但它不符合客户的质量保证要求。问题是我无法控制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();
}
答案 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