2 votes

Est-il possible de créer un nouvel hyperlien asp à partir de Code Behind ?

Je me demande s'il est possible d'avoir un hyperlien asp sur une page aspx et dans le code derrière de le définir comme un nouvel hyperlien dans la section Page_Load. J'ai essayé et cela ne semble pas fonctionner, mais je voulais en savoir plus sur les mécanismes (est-ce quelque chose qui ne fonctionne pas, ou qui pourrait fonctionner plus tôt dans le cycle de vie de la page, ou pourquoi cela ne fonctionne pas).

Exemple de code

Page Aspx

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

Code Behind

var newHyperLink = new HyperLink();
newHyperLink.NavigateUrl= url;
newHyperLink.Text = "Hello World";
myHyperLink = newHyperLink;

6voto

Damien Dennehy Points 1614

Vous n'avez pas besoin de créer un nouveau contrôle, utilisez simplement celui que vous avez déclaré. Vous n'utilisez pas non plus la bonne propriété.

Remplacez votre code derrière par ceci :

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

Je ne pense pas que vous puissiez remplacer un contrôle comme vous l'avez mentionné. Je pense qu'il s'agit d'ajouter ou de supprimer un contrôle par le biais de la collection de contrôles d'un contrôle parent.

Ie,

<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);
    }

2voto

dave thieben Points 2585

Au cours du cycle de vie de la page, il instancie des variables pour les contrôles de la page ASPX et les ajoute à la collection Page.Controls. Lorsqu'il rend la page, il rend chaque contrôle enfant de la collection Page.Controls.

Ce que vous faites, c'est réaffecter la variable qui était affectée au contrôle instancié dans le cycle de vie, mais qui est maintenant affectée au contrôle instancié par l'utilisateur. Cependant, le contrôle d'origine est toujours présent dans la collection Page.Controls, et vous n'y faites plus référence.

Vous devez supprimer l'ancien contrôle de Page.Controls, instancier votre nouveau contrôle et l'ajouter à la collection Page.Controls au même endroit que l'ancien.

Cependant, je ne vous recommande pas de procéder ainsi. Il existe probablement une meilleure façon de faire ce que vous essayez d'obtenir, mais c'est la raison pour laquelle cela ne fonctionne pas.

0voto

diadem Points 435

.NET dispose d'un collecteur d'ordures qui s'occupe du nettoyage du code. C'est pourquoi vous n'avez pas besoin (généralement) de destructeurs.

Ce qui est pertinent dans ce cas, c'est que quelque chose "disparaît" lorsque rien n'y fait référence.

Ce qui est également pertinent est ce que myHyperLink représente. myHyperLink n'est pas l'objet lui-même, c'est un pointeur à l'objet. Il existe certains types de base tels que int où ce n'est pas le cas, mais lorsque vous traitez des objets complexes, c'est ce qui se passe. Dans ce cas, vous avez donc à la fois le pointeur myHyperLink et l'objet vers lequel myHyperLink pointe. Cette distinction est très importante.

Dans votre code, nous avons l'hyperlien lui-même et le pointeur myHyperLink. L'objet hyperlien lui-même est référencé à la fois par Page.Form.Controls et votre référence locale à myHyperLink.

Quand vous avez dit

myHyperLink = newHyperLink ;

Ce que vous avez fait, c'est changer ce vers quoi le pointeur myHyperLink pointait. L'hyperlien original existait toujours dans Page.Form.Controls. Cela signifie que l'hyperlien original ne disparaît pas - il est toujours référencé.

Ensuite, pourquoi l'original était-il toujours affiché et pas le nouveau ? Eh bien, lorsque la page est rendue, elle se soucie principalement de ce qui existe dans Page.Form.Controls. Puisque la référence originale est toujours dans page.form.controls, c'est ce qui est rendu. Bien que le nouvel hyperlien existe, il n'a jamais été ajouté à Page.Form.Controls. Il a simplement été référencé par votre pointeur et manipulé. À moins que vous ne l'ajoutiez à Page.Form.Controls (ou que vous ne remplaciez manuellement le rendu ou que vous ne fassiez quelque chose de bizarre), il ne s'affichera pas.

0voto

Mahyar Kakaee Points 57

Vous pouvez aussi essayer ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X