Рендеринг серверного элемента управления с использованием 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;
}