Рендеринг серверного элемента управления с использованием HTMLTextWriter приводит к потере контроля над стандартными функциями (например, обработчик события Click)

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

ChkBoxLst1 & ChkBoxLst2 & Button1 через код позади, а затем использовать 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 ответа

Решение

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

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

Попробуйте этот метод для визуализации элементов управления в 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;
    }
Другие вопросы по тегам