2012-02-29 35 views
5

Tengo una aplicación de Web Forms de ASP.NET. En mi aplicación tengo un GridView que funciona sin problemas. Tengo varios campos de texto y el último es <asp:hyperlinkfield>.Cómo reemplazar programáticamente un HyperLinkField en un GridView de ASP.NET

Ahora me gustaría cambiar el campo mediante programación colocando un enlace simple en lugar del hyperlinkfield si se cumple una condición específica. Por lo tanto cojo el onRowDataBound evento:

Sub myGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles myGridView.RowDataBound 

    If (condition) Then 
      Dim link = New HyperLink() 
      link.Text = "login" 
      link.NavigateUrl = "login.aspx" 
      e.Row.Cells(3).Controls.Add(link) 
     End If 
    End If 
End Sub 

donde n es la célula donde se coloca el hyperlinkfield. Con este código, solo agrega al hyperlinkfield el nuevo link. ¿Cómo puedo reemplazarlo?

PS: El código es en VB6 pero yo soy un programador de C#, se aceptan respuestas con los dos idiomas

Respuesta

5

Retire el control que desea reemplazar de la colección antes de añadir uno nuevo:

protected void TestGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
    HyperLink newHyperLink = new HyperLink(); 
    newHyperLink.Text = "New"; 
    e.Row.Cells[3].Controls.RemoveAt(0); 
    e.Row.Cells[3].Controls.Add(newHyperLink); 
    } 
} 

Pero estoy de acuerdo con los demás, basta con cambiar las propiedades del enlace existente:

protected void TestGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
    HyperLink link = e.Row.Cells[0].Controls[0] as HyperLink; 
    if (link != null) 
    { 
     link.Text = "New"; 
     link.NavigateUrl = "New"; 
    } 
    } 
} 
+0

Te doy la respuesta, pero el primero es el que estaba buscando. La razón principal es que mi 'HyperLinkField' tiene otros atributos vinculados a los datos y, por lo tanto, no puedo simplemente reemplazar Text y NavigateUrl. Lo sorprendente es que ninguno notó que el control que tenía que eliminar era un 'HyperLinkField' que difería de' HyperLink'. Supongo que la primera solución funciona sin problemas a menos que haya algo de JavaScript conectado a la actualización de datos de 'GridView' pero no es mi caso. ¡Muchas gracias! – CiccioMiami

1

En lugar de crear un nuevo enlace en este punto, obtenemos el enlace que ya se genera como parte del campo.

If (e.Row.RowType = DataControlRowType.DataRow) Then 
    Dim link = e.Row.Cells(3).Controls(0) 
    link.Text = "login" 
    link.NavigateUrl = "login.aspx" 
End If 

EDIT: Agregado Si el bloque para evitar la acción fuera de líneas de artículos.

+0

gracias pero me da error El valor del tipo 'System.Web.UI.WebControls.HyperLinkField' no se puede convertir a 'System.Web.UI.Control'. – CiccioMiami

+0

¿Puedes decir exactamente qué estás tratando de hacer? – Pankaj

+0

gracias. Si el usuario no ha iniciado sesión, en lugar del enlace de descarga, quiero mostrar un enlace de inicio de sesión – CiccioMiami

1

Usted puede hacer esto en su archivo aspx:

<asp:HyperLink Text='<%# condition ? "TextIfTrue" : "TextIfFalse" %>' NavigateUrl='<%# condition ? "UrlIfTrue" : "UrlIfFalse" %>' /> 

o emitir su

e.Row.Cells(3).Controls(0) 

en un hipervínculo y cambiar sus valores.

+0

gracias. Ya lo pensé, pero las condiciones son complejas. Además, siempre trato de poner código en el código, no me gusta el aspx "sucio" – CiccioMiami

6

En situaciones así normalmente convierto el campo vinculado a un campo de plantilla.

<asp:TemplateField HeaderText="Title" SortExpression="Title"> 
    <ItemTemplate> 
     <asp:HyperLink ID="TitleHyperLink" runat="server" ></asp:HyperLink> 
    </ItemTemplate> 
</asp:TemplateField> 

Y haga el resto del trabajo en el código subyacente.

protected void grid_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     var link = (HyperLink)e.Row.FindControl("TitleHyperLink"); 

     if (link != null) 
     { 
      if (condition) 
      { 
       link.Text = "login"; 
       link.NavigateUrl = "login.aspx"; 
      } 
      else 
      { 
       link.Text = "default text"; 
       link.NavigateUrl = "default.aspx"; 
      } 
     } 
    } 
} 
+1

gracias esta solución es buena, pero lo molesto es que hyperlinkfield no tiene una propiedad Id – CiccioMiami

+0

Lo que @lincolnk está diciendo es usar un TemplateField, entonces puedes usar un HyperLink en lugar de un HyperLinkField, que tendrá un Id. – dugas

0

Se puede utilizar en el aspx:

<asp:HyperLink ID="HyperLink1" CssClass="exercise" runat="server" NavigateUrl="#">Search ¡here!</asp:HyperLink> 

En el código subyacente: Se puede utilizar también un método:

public string SharePoint(string x) 
{ 

    string page1, page2; 

       if (x== "1") 
       { 
        string page1="http://nwpage/files.zip"; 

        return page1; 
       } 

       else 
       { 


        string page2="http://example2.aspx"; 
        return page2; 
       } 


     } 

Si llamo al control en el otro método o carga de página, puede agregar HyperLink1 con la ruta

string path= SharePoint(x); 
HyperLink1.NavigateUrl = path; 
Cuestiones relacionadas