2010-07-08 46 views
2

我想知道是否有可能在aspx頁面上有一個asp超鏈接,並且在後面的代碼中將其設置爲Page_Load部分中的新超鏈接。我試過這個,看起來不行,但想知道更多關於這個機制的東西(這是不是工作,或者可以在頁面生命週期的早期工作,或者爲什麼它不工作)。是否有可能從代碼背後設置一個新的ASP超鏈接

示例代碼

ASPX頁面

<asp:HyperLink ID="myHyperLink" runat="server" /> 

代碼隱藏

​​

回答

0

.NET有一個垃圾收集器負責其代碼清理。這就是爲什麼你(通常)不需要析構函數。

這種情況下相關的事情是,當沒有任何引用它時,某些東西「消失」。

什麼也是myHyperLink代表。 myHyperLink不是對象本身,它是指針的對象。在某些基本類型中,如int不是這種情況,但在處理複雜對象時,就是這樣。所以在這種情況下,你有myHyperLink指針和myHyperLink指向的對象。這個區別非常重要。

在你的代碼中,我們有超鏈接本身和myHyperLink指針。超鏈接對象本身由Page.Form引用。控件您當地對myHyperLink的引用。

當你說

myHyperLink = newHyperLink;

你所做的是改變myHyperLink指針指向的內容。原始超鏈接仍然存在於Page.Form.Controls中。這意味着原始超鏈接不會消失 - 它仍然被引用。

接下來,爲什麼原始的仍然顯示,而不是新的?那麼,當頁面呈現時,它主要關心Page.Form.Controls中存在的內容。由於原始引用仍然在page.form.controls中,因此將呈現該內容。新的超鏈接存在時,新的超鏈接從未添加到Page.Form.Controls。它只是由你的指針引用和操縱。除非你將它添加到Page.Form.Controls(或手動覆蓋渲染/其他奇怪的東西),否則它不會顯示。

6

你並不需要創建一個新的控件,只需使用一個你dec LARED。 你也沒有使用正確的屬性。

與此背後替換代碼:

myHyperLink.NavigateUrl = "http://url.com"; 

我不相信你可以重寫怎麼樣,你提到的控制,我認爲這是通過父控件的控件集合添加或移除控制的情況下, 。

也就是說,

<form id="form1" runat="server"> 
<div> 
    <asp:HyperLink ID="HyperLink1" runat="server">HyperLink</asp:HyperLink> 
</div> 
</form> 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     HyperLink newHyperLink = new HyperLink(); 
     newHyperLink.NavigateUrl = "http://google.com"; 
     newHyperLink.Text = "Hello World"; 
     Page.Form.Controls.Remove(HyperLink1); 
     Page.Form.Controls.Add(newHyperLink); 
    } 
+0

真的,我可以這樣做的,但我更感興趣的是,爲什麼它不以這種方式工作。似乎這兩種方法應該工作? – ChrisHDog 2010-07-08 00:29:59

+0

它確實有效,但是如上所述以一種迂迴的方式。我從來沒有像你的問題那樣直接設置控件 - 因爲控件已經創建,效率不高。 – 2010-07-08 00:51:29

+0

不會只是在頁面底部添加新的超鏈接嗎? (在你的例子中只有一個超鏈接,但超鏈接可能被其他項包圍) – ChrisHDog 2010-07-08 00:52:17

2

在頁面生命週期,它將實例ASPX頁面上的控制變量,並將它們添加到收藏Page.Controls。當它呈現頁面時,它會呈現Page.Controls集合中的每個子控件。

您正在做的是重新分配用於分配給生命週期實例化控件的變量,但現在分配給您的用戶實例化控件,但原始控件仍存在於Page.Controls集合中,並且你不再有參考。

你需要做的是從Page.Controls中刪除舊的控件,實例化你的新控件並將它添加到Page.Controls集合中,與舊的控件相同。

但是,我不會推薦這樣做。有可能有更好的方式來做你想要達到的目標,但這就是爲什麼它不起作用。

+2

請注意1)大多數控件的內部都有一個Controls屬性。您可以創建一個佔位符並向該佔位符添加任意數量的超鏈接2)您必須密切關注狀態並確保它們在應該被添加時3)雖然可以通過foo x = new foo()創建默認控件,如果你有一個ascx頁面,你應該說foo x = LoadControl(「〜/ Controls/Foo.ascx」),否則頁面將無法正常加載4)一定要給Control集合添加一切ID – diadem 2010-07-08 16:23:59

0

你可以試試這個太:

Hyperlink HL1 = new Hyperlink(); 
HL1.Text = "Hyperlink"; 
HL1.TabIndex = 1; 
HL1.AccessKey = "w"; 
HL1.NavigateUrl = "http://stackoverflow.com/"; 
相關問題