Подтвердить что ты не робот

Можете ли вы добавить дочерние элементы управления в HtmlGenericControl?

У меня очень простая операция, когда я пытаюсь добавить HtmlGenericControl в другой HtmlGenericControl:

protected void Page_Load(object sender, EventArgs e)
{

  HtmlGenericControl div = new HtmlGenericControl("div");
  HtmlGenericControl p = new HtmlGenericControl("p");

  div.Controls.Add(p);//exception occurs
}

Исключение выбрано только в отладчике - сама страница отображает, как будто ничего не произошло. Однако что-то определенно происходит, как и в большей части кода, элементы управления не отображаются так, как должны.

enter image description here

Фактическое исключение:

{InnerText = '((System.Web.UI.HtmlControls.HtmlContainerControl)(div)).InnerText' threw an exception of type 'System.Web.HttpException'}

Я не могу понять, почему это происходит, поскольку вы должны иметь возможность добавлять элементы управления друг к другу таким образом.

Обратите внимание, что из первого ответа я попытался снова с идентификаторами, но он все еще не работает:

enter image description here

У меня есть дополнительная информация. При использовании элемента управления Placeholder в качестве родителя исключение не существует:

protected void Page_Init()
{
  PlaceHolder ph = new PlaceHolder();
  HtmlGenericControl p = new HtmlGenericControl("p");

  ph.Controls.Add(p);//no problem
}
4b9b3361

Ответ 1

"Исключение выбрано только в отладчике - сама страница отображает как будто ничего не случилось".

То, что InnerText не работает, если есть дочерние элементы управления; то есть по дизайну, потому что он не хочет отображать всю иерархию элементов управления в то время для различных характеристик производительности, жизненного цикла и побочных эффектов.

"... что-то определенно происходит, как в большей части кода, элементы управления не отображаются так, как должны".

Что это значит? Что неправильно отображается в "большей части" кода? Я предполагаю, что это проблема где-то еще и не связана с тем, что у вас есть в вашем вопросе здесь.

Итак, я думаю, что все в порядке. Игнорируйте исключение в InnerText в родительском элементе управления. Вам нужно задать новый Вопрос относительно любой проблемы, с которой вы сталкиваетесь с "большей частью" вашего кода.

Ответ 2

Я думаю, что простым решением избежать этой ошибки может быть преобразование дочернего HtmlGenericControl в строку, а затем добавление ее родителям внутри атрибута InnerHtml. что-то вроде этого:

HtmlGenericControl parent = new HtmlGenericControl("div");
HtmlGenericControl child = new HtmlGenericControl("div");
StringWriter stringWriter = new StringWriter();
HtmlTextWriter twr = new HtmlTextWriter(stringWriter);
child.RenderControl(twr);
string rendered=stringWriter.ToString().Replace("\r","").Replace("\n","").Replace("\t","");
parent.InnerHtml =  rendered;

Ответ 3

вам нужно сначала использовать панель. то вы можете создать дочерний HtmlGenericControl, а затем родительский HtmlGenericControl, а затем вы можете добавить родительский элемент управления в панель. например:

<asp:Panel ID="panel" runat="server" ></asp:Panel>

//parent
HtmlGenericControl div = new HtmlGenericControl("div"); 

//child 
HtmlGenericControl p = new HtmlGenericControl("p");      

// adding child control to parent control.
div.Controls.Add(p);

div.Visible = true;

//adding parent control to panel
panel.Controls.Add(div);

Ответ 4

Я ошибаюсь, см. комментарий Джона Адамса.

Я подозреваю, что это имеет какое-то отношение к элементам управления, у которых нет установленных идентификаторов. Я мог ошибаться... но вот как установить идентификаторы, если это проблема.

HtmlGenericControl и id Забастовкa >

Ответ 5

Просто мое небольшое предположение:

protected void Page_Load (отправитель объекта, EventArgs e) {

HtmlGenericControl div = new HtmlGenericControl ( "div" );
  div.InnerText = ";

HtmlGenericControl p = new HtmlGenericControl (" p");

div.Controls.Add(p);//возникает исключение}

Ответ 6

Я просто сделал небольшое исследование MSDN. По-видимому, вам запрещено использовать более одного HtmlContainerControl.

Исключение ---------- Условие

HttpException. Существует более одного HTML-сервера.

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

    try
    {
        HtmlGenericControl div = new HtmlGenericControl("div");
        div.ID = "div1";
        HtmlGenericControl p = new HtmlGenericControl("p");
        p.ID = "p1";
        div.Controls.Add(p);
        div.InnerText = "sep";
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        System.Diagnostics.Debug.WriteLine(ex.StackTrace);
    }

Возможно, это только сообщение отладчика для VS.. не совсем уверен в этом... Я собираюсь снова отредактировать мой ответ позже.

Ответ 7

Если вы попытаетесь сделать это

string text = div.InnerText;

вы получите следующее исключение

Не удается получить внутренний контент id1, потому что содержимое не является литералом.

который сообщает, что вы не можете увидеть сгенерированный html таким образом.

Ответ 8

вы можете

создайте asp: Panel и получим как div точно и добавьте все элементы управления, которые вы хотите внутри него

или

div.InnerHtml + = p.InnerHtml

это добавит ваш рендеринг html p в div