Pregunta

He estado analizando algunas preguntas similares sin suerte. Lo que me gustaría hacer es tener una vista de cuadrícula que para ciertos elementos muestre un botón de enlace y para otros elementos muestre un hipervínculo. Este es el código que tengo actualmente:

public void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var data = (FileDirectoryInfo)e.Row.DataItem;
        var img = new System.Web.UI.HtmlControls.HtmlImage();
        if (data.Length == null)
        {
            img.Src = "/images/folder.jpg";
            var lnk = new LinkButton();
            lnk.ID = "lnkFolder";
            lnk.Text = data.Name;
            lnk.Command += new CommandEventHandler(changeFolder_OnCommand);
            lnk.CommandArgument = data.Name;
            e.Row.Cells[0].Controls.Add(lnk);
        }
        else
        {
            var lnk = new HyperLink();
            lnk.Text = data.Name;
            lnk.Target = "_blank";
            lnk.NavigateUrl = getLink(data.Name);
            e.Row.Cells[0].Controls.Add(lnk);
            img.Src = "/images/file.jpg";
        }
        e.Row.Cells[0].Controls.AddAt(0, img);
    }
}

donde la primera celda es un TemplateField. Actualmente, todo se muestra correctamente, pero los botones de enlace no activan el controlador de eventos Command y todos los controles desaparecen en la devolución de datos.

¿Alguna idea?

¿Fue útil?

Solución

Creo que debería intentar forzar un reenlace de la devolución de datos sobre de GridView. Esto asegurará que los controles dinámicos se vuelvan a crear y sus controladores de eventos se vuelvan a unir. Esto también debería evitar su desaparición después de la devolución de datos.

IOW, llame a DataBind () en el GridView en la devolución de datos.

Otros consejos

¡También puede agregarlos en el evento Row_Created y luego no tiene que deshacerlos!

¿Por qué no crea el botón de forma declarativa, y crea el hypen de manera declarativa (usando un control literal) y luego usando la sintaxis de enlace de datos y establece la visibilidad que es la propiedad Visible de los controles en verdadero o falso según sea necesario:

Visible='<%#((FileDirectoryInfo)Container.DataItem).Length == null) %>' 

Algo así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top