Решение HtmlTextWriter, добавляемое в качестве WebControl - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть решение, которое работает, но оно не соответствует требованиям заказчика. Проблема в том, что я не могу контролировать расположение элементов WebControls, они должны быть относительно графика, который находится над ними. Как я вижу, мне нужно " скомпилировать " sb.ToString () в WebControl, который я затем смогу Controls.Add ().

Мне нужно перейти от этого рабочего решения:

приватная пустота 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>
}

Ключ - это 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();
}

1 Ответ

0 голосов
/ 07 сентября 2011

Я решил почти ту же задачу.Вот мои результаты:

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 версии того же элемента управления.Вот два огромных преимущества: а) код все еще читабелен и описан в терминах asp.net.б) вы можете использовать WebControlHelper.RenderControl везде, где вам нужно решить одинаковую задачу

...