Рендеринг серверного элемента управления с использованием HTMLTextWriter приводит к потере контроля над стандартными функциями (т. Е. Обработчик события Click) - PullRequest
1 голос
/ 02 марта 2012

Я хочу добавить серверные элементы управления (CheckBoxList s & Button):

ChkBoxLst1 & ChkBoxLst2 & Button1 через Code-behind, а затем используйте HTMLTextWriter для визуализации элемента управления.

Кажется, я не могу этого сделать.

Все вышеперечисленное в визуальной веб-части.

Что я пробовал:
Глобальный:

CheckBoxList ChkBoxLst2 = new CheckBoxList();
Button Bttn2 = new Button();
Label lbl2 = new Label(); 

StringWriter stringWriter = new StringWriter(); 

Загрузка страницы:

using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
        {
            ChkBoxLst2.Items.Add(new ListItem("Three", "3"));
            ChkBoxLst2.Items.Add(new ListItem("Four", "4"));

            ChkBoxLst2.RenderControl(writer);
            lbl2.RenderControl(writer);
            Bttn2.Click += new EventHandler(this.Bttn2_Click);
            Bttn2.Text = "Click this HTMLText WriteButton!";
            Bttn2.RenderControl(writer); 

        }

        spn.InnerHtml = stringWriter.ToString(); 

Обработчик событий:

 void Bttn2_Click(Object sender, EventArgs e)
    {
        foreach (ListItem item in ChkBoxLst2.Items)
        {
            if (item.Selected == true)
            {
                if (IsPostBack)
                {
                    lbl.Text += item.Text + ", ";
                }
            }
        }
    }

EventHandler не срабатывает, а выбранные значения не сохраняются так, как я это делал выше. Есть идеи, почему бы и нет? Я попытался сравнить два списка флажков, но реализация HTMLTextWriter не сработала, тогда как простой .NET сделал то же самое
В общем, я думаю, что это моя реализация HTMLTextWriter / как добавить серверный элемент управления.

Обратите внимание, что spn - это буквенный элемент управления span в разметке.

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

попробуйте этот метод для визуализации элементов управления в HTML-строку:

    public static string ControlRenderToString(Control tmpControl)
    {
        string Content;

        System.IO.StringWriter sWriter = new System.IO.StringWriter();
        HtmlTextWriter htwObject = new HtmlTextWriter(sWriter);
        tmpControl.RenderControl(htwObject);

        Content = sWriter.ToString();
        sWriter.Close();

        return Content;
    }
2 голосов
/ 02 марта 2012

Несмотря на то, что вы передали эти элементы управления в браузер, они не являются частью дерева элементов управления страницы и даже не будут существовать при обратной передаче. Любые динамически добавленные элементы управления необходимо добавлять при каждом запросе.

Зачем вообще играть с HtmlTextWriter? Просто добавьте элементы управления на страницу во время Page_Load, и они будут отображены для вас. Сделайте это за пределами «if (! Page.IsPostBack)», и они будут появляться при каждой загрузке страницы, что вам и нужно.

...