2011-09-07 44 views
0

我有一個可行的解決方案,但它不符合客戶的QA要求。問題是我無法控制WebControls的位置,它們需要相對於高於這些的圖表。我如何看到它,我需要將「編譯」的sb.ToString()放入一個WebControl中,然後我可以使用Controls.Add()。HtmlTextWriter解決方案作爲WebControl被添加

我需要這個工作的解決方案去:

私人無效SetTextBoxes()
{
文本框myBox上=新的TextBox();
System.Web.UI.WebControls.Label myLabel = new 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> 
} 

主要是Controls.Add(),因爲它關係到覆蓋該代碼等少數器WebControls的模塊化系統。

我有一個解決方案可能看起來像什麼的建議。

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

您打算在什麼階段調用WriteHtml()方法? – IceN

+0

SetTextBoxes()在CreateChildControls()期間被調用,我假定WriteHtml會替換它。 – DoStuffZ

回答

0

我解決了幾乎相同的任務。這裏是我的結果:如果你想獲得呈現的HTML你正在做財產以後這樣

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)在主代碼:

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(); 
     } 
    } 

1)我創建小助手方法通過這個實現,你可以保持SetTextBoxes()不變。你會得到2個版本的相同的控制。這裏有兩個巨大的好處: a)代碼仍然可讀並且在asp.net中描述。 b)您可以在任何需要解決類似任務的地方使用WebControlHelper.RenderControl

+1

我看了一下你的解決方案。它可能會回答somebody的答案,但恐怕它沒有回答這個問題。我閱讀它時,你會得到一個字符串列表中的html標籤列表,並將其與一些值混合顯示。最後,我做了一個GridView,並且做了一個Controls.Add(GridView)。 – DoStuffZ

+0

即使你沒有回答我的問題,你仍然提出最低公分母(sp?)的考慮。這是字符串,相對於複雜的對象。有一些功能可以將複雜的Web對象轉換爲簡單的字符串,所以某種程度上你可能比你意識到的更爲正確。 – DoStuffZ