Можете ли вы добавить дочерние элементы управления в HtmlGenericControl? - PullRequest
17 голосов
/ 12 июля 2011

У меня очень простая операция, в которой я пытаюсь добавить 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
}

Ответы [ 8 ]

1 голос
/ 15 февраля 2014

сначала нужно использовать панель.затем вы можете создать дочерний 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);
1 голос
/ 28 сентября 2011

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

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

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

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

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

1 голос
/ 12 июля 2012

я думаю, что простым решением избежать этой ошибки может быть рендеринг дочернего 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;
0 голосов
/ 29 сентября 2011

Вы можете

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

или

div.InnerHtml + = p.InnerHtml

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

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

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

string text = div.InnerText;

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

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

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

0 голосов
/ 12 июля 2011

Я только что провел небольшое 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 ... не совсем уверен в этом ...собираюсь изменить мой ответ позже ..

0 голосов
/ 12 июля 2011

Просто мое маленькое предположение:

защищенный void Page_Load (отправитель объекта, EventArgs e) {

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

HtmlGenericControl p = new HtmlGenericControl ("p");

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

0 голосов
/ 12 июля 2011

Я не прав, см. Комментарий Джона Адамса.

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

HtmlGenericControl и id

...