2011-07-12 73 views
16

我有一個非常簡單的操作,我嘗試將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'} 

我不明白爲什麼會這樣,你應該能夠控制這種方式彼此相加。

要注意,從第一個答案,我的ID再次嘗試,但它仍然不能正常工作:

enter image description here

我有一些更多的信息。 當使用一個佔位符控件作爲父母,也沒有例外:

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

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

回答

0

我是不正確,請約翰·亞當斯看到評論。

我懷疑它與沒有設置ID的控件有關。我可能是錯的......但是這裏是如何設置ID,如果這是問題。

HtmlGenericControl and id

+0

已經試過,但仍然會拋出異常 – Petras

+1

不正確。 ID僅用於外部代碼來引用對象。在內部,渲染過程遍歷子控件,並在必要時自動分配ID。 –

0

只是我的小假設:

保護無效的Page_Load(對象發件人,EventArgs的){

HtmlGenericControl的div =新HtmlGenericControl( 「分區」);
div.InnerText =「」;

HtmlGenericControl p = new HtmlGenericControl(「p」); //發生異常}

+0

不,不是這樣。 – Petras

0

我只是做了一點MSDN研究;

div.Controls.Add(P)。顯然你不允許使用多個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

如果你嘗試這樣做

string text = div.InnerText; 

,你會得到一個異常

無法獲取id1的內容,因爲內容不是字面的。

它告訴你看不到這樣生成的html。

1

「只在調試器中引發異常 - 頁面本身呈現 ,好像什麼都沒有發生。」

這很好,因爲如果存在子控件,InnerText將不起作用;這是設計的原因,因爲它不想爲各種性能,生命週期和側面影響原因呈現當時控件的整個層次結構。

「...肯定會發生某些事情,因爲在代碼的較大部分中, 控件沒有按照它們應該呈現的方式顯示。」

這是什麼意思?在代碼的「大部分」中渲染不正確?我的猜測是這是其他地方的問題,並且與您在此問題中的問題無關。

所以我認爲你很好。忽略父控件上的InnerText中的異常。你需要提出一個新的問題,關於你的代碼中「大部分」的問題。

0

您可以

創建ASP:面板,它呈現爲DIV準確,並添加你想要它裏面

div.InnerHtml + = p.InnerHtml

這一切控制將您的渲染的p的div添加到div

1

我認爲一個簡單的解決方案來避免這個錯誤可以將子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; 
1

您需要先使用面板。那麼您可以創建子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); 
相關問題