Foros del Web » Programación para mayores de 30 ;) » .NET »

Crear hyperlinks dinamicamente en un Datagrid

Estas en el tema de Crear hyperlinks dinamicamente en un Datagrid en el foro de .NET en Foros del Web. Hola, tengo un Datagrid paginado por código (c#) que devuelve datos que varian de un dia a otro. Me gustaría que estos resultados fueran a ...
  #1 (permalink)  
Antiguo 08/10/2004, 06:17
 
Fecha de Ingreso: agosto-2004
Mensajes: 9
Antigüedad: 19 años, 8 meses
Puntos: 0
Crear hyperlinks dinamicamente en un Datagrid

Hola, tengo un Datagrid paginado por código (c#) que devuelve datos que varian de un dia a otro. Me gustaría que estos resultados fueran a su vez hiperenlaces a otra pagina a la que pasrle como paramentro el texto del propio resultado. Es decir, el datagrid consiste en 2 columnas con el par (id, descripcion) y quiero que al pinchar en este par se redirija a otra página pasándole el parámetro (id o descripcion)
El codigo del metodo BinGrid es el siguiente:
<code>
void BindGrid(string stralpha)
{
OdbcConnection cn;
OdbcDataAdapter da;
DataSet ds;
//Miguel

HyperLinkColumn hyp ;
TableCell td = new TableCell();
//Miguel

//Comprueba que el usuario y password son correctos
AppSettingsReader rdr =new AppSettingsReader();
string strCadenaConexionBD = rdr.GetValue("ConexionBDASA",typeof(string)).ToStr ing();

cn= new OdbcConnection();
cn.ConnectionString=strCadenaConexionBD;


//string strsql ="select terapia_id, terapia_descripcion from terapia ";
//string strsql ="select especialidad_id, registrado from especialidad ";
string strsql ="select especialidad_id as CODIGO, registrado as REGISTRADO from especialidad ";
if (stralpha=="")
{
strsql = strsql + " where registrado like'" + stralpha + "A%'" +" order by registrado";
}
else
{
strsql=strsql + " where registrado like'" + stralpha + "%'" +" order by registrado";
}
da= new OdbcDataAdapter(strsql,cn);
ds= new DataSet ();

da.Fill (ds, "Product");
if (ds.Tables [0].Rows.Count ==0)
{
Response.Write ("No Data Found");
DataGrid1.DataSource=null;
DataGrid1.DataBind ();
}
else
{



DataGrid1.PageSize=(ds.Tables [0].Rows.Count);
DataGrid1.DataSource =ds;

DataGrid1.DataBind();


}
}
<code>

alguine sabe cómo puedo hacer para crear estos hiperenlaces por codigo???
  #2 (permalink)  
Antiguo 08/10/2004, 09:28
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
No sería mas fácil colocar en tu datagrid un hyperlink y cargarle el id como parmetro de esta forma:

Cita:
<asp:datagrid....
<Columns>
<asp:TemplateColumn HeaderText="Algun Título">
<ItemTemplate>
<asp:hyperlink id=Hyperlink1 runat="server" navigateurl='<%# DataBinder.Eval (Container.DataItem,"CODIGO", "pagina_destino.aspx?id={0}") %>' Text="Algun Textp">
</asp:hyperlink>
</ItemTemplate>
...
..
</asp:datagrid>
Con ello te cargará automaticamente el link con el parámero ID que te llevará a la página_desitino.aspx

Espero te sirva.

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 13/10/2004, 09:30
 
Fecha de Ingreso: agosto-2004
Mensajes: 9
Antigüedad: 19 años, 8 meses
Puntos: 0
Hola,

lo malo de la solucion que me dices es que añade una columna más a la tabla, y a mi me gustaría mostrar sólo las 2 columnas de la query y que una de ellas (especialidad_id) sea la que haga de hiperenlace.
Por eso creo que tendría que hacerlo en miPagina.aspx.cs y no en miPagina.aspx ...

Por cierto, ¿cómo hago (en miPagina.aspx.cs) para llamar a estas 2 columnas como quiera y no con el nombre del campo de base de datos?
  #4 (permalink)  
Antiguo 13/10/2004, 09:51
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Cita:
es que añade una columna más a la tabla, y a mi me gustaría mostrar sólo las 2 columnas de la query y que una de ellas (especialidad_id) sea la que haga de hiperenlace.
Pues entonces haz ésto: (recuerda poner tu grid en autogenerar columnas en false )

Cita:
<Columns>
<asp:TemplateColumn HeaderText="Algun Título">
<ItemTemplate>
<asp:hyperlink id=Hyperlink1 runat="server" navigateurl='<%# DataBinder.Eval (Container.DataItem,"CODIGO", "pagina_destino.aspx?id={0}") %>' Text='<%# Container.DataItem("CODIGO") %>'>
</asp:hyperlink>
</ItemTemplate>
<asp:BoundColumn DataField="Registro" HeaderText="Registro"></asp:BoundColumn>
</columns>
..
Con ello ya tienes 2 columnas y la primera es el hyperlink con el texto del campo "CODIGO"

Cita:
para llamar a estas 2 columnas como quiera y no con el nombre del campo de base de datos?
Pues ya lo estas haciendo.. desde tu query con el Alias..

Cita:
string strsql ="select especialidad_id as CODIGO, registrado as REGISTRADO from especialidad ";
Salu2
  #5 (permalink)  
Antiguo 13/10/2004, 10:23
 
Fecha de Ingreso: agosto-2004
Mensajes: 9
Antigüedad: 19 años, 8 meses
Puntos: 0
Me sale el siguiente error:
CS0118: 'System.Web.UI.WebControls.DataGridItem.DataItem' denota 'propiedad', cuando se esperaba 'método'
??

Por cierto, a pesar de tener así la query, los nombres de las columnas que salían eran los de los campos en base de datos, por eso lo preguntaba
  #6 (permalink)  
Antiguo 13/10/2004, 10:37
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Cita:
denota 'propiedad', cuando se esperaba 'método'
Ups.. es que puse la sintaxis para Vb.net y se me paso que es para c# (la costumbre )

Te quedaría así:

Cita:
<ItemTemplate>
<asp:HyperLink Runat=server NavigateUrl='<%# DataBinder.Eval(Container.DataItem,"CODIGO","pagina_destino. aspx?id={0}") %>'
Text='<%# DataBinder.Eval(Container.DataItem,"CODIGO") %>'> </asp:HyperLink> </ItemTemplate>
La ventaja del dataBinder.Eval es la misma sintaxista tanto para c# como vb.net.

Cita:
nombres de las columnas que salían eran los de los campos en base de datos
Por eso te mencionaba que pusieras en autogenerar columnas en false para que las personalizes.. ya sea usando un bound columnd (<asp:BoundColumn DataField="Tu_Campo_BD" HeaderText="Algun Título"></asp:BoundColumn>) ó un item template (<asp:TemplateColumn HeaderText="Algun Titulo">)

Creo que ahora si te va a funcionar..
  #7 (permalink)  
Antiguo 14/10/2004, 06:24
 
Fecha de Ingreso: agosto-2004
Mensajes: 9
Antigüedad: 19 años, 8 meses
Puntos: 0
Efectivamente así funciona, pero no me sirve por una cosa: la página se genera por este codigo html con lo cual no se ejecuta el código *.cs para cargar la página. Esto es un problema para mi, porque yo genero por código un datagrid paginado alfabéticamente, y de esta manera que me dices se me carga el datagrid pero sin paginar. Lo que me has indicado hacer en la parte html de la página lo necesito hacer en la parte de código (cs) e la página, en concreto en el método BindGrid, que recupera las entradas que empiecen por una letra y las carga en el DataGrid.
¿Podrías indicarme cómo hacerlo?
El método es éste:
<code>
void BindGrid(string stralpha)
{
OdbcConnection cn;
OdbcDataAdapter da;
DataSet ds;

//recupero la cadena de conexion
AppSettingsReader rdr =new AppSettingsReader();
string strCadenaConexionBD = rdr.GetValue("ConexionBDASA",typeof(string)).ToStr ing();

cn= new OdbcConnection();
cn.ConnectionString=strCadenaConexionBD;

string strsql ="select especialidad_id as CODIGO, registrado as REGISTRADO from especialidad ";
if (stralpha=="")
{
strsql = strsql + " where registrado like'" + stralpha + "B%'" +" order by registrado";
}
else
{
strsql=strsql + " where registrado like'" + stralpha + "%'" +" order by registrado";
}
da= new OdbcDataAdapter(strsql,cn);
ds= new DataSet ();

da.Fill (ds, "Product");
if (ds.Tables [0].Rows.Count ==0)
{
Response.Write ("No Data Found");
DataGrid1.DataSource=null;
DataGrid1.DataBind ();
}
else
{

DataGrid1.PageSize=(ds.Tables [0].Rows.Count);
DataGrid1.DataSource =ds;
DataGrid1.DataBind();

}
}
</code>
También tengo otra duda: este datagrid está conetnido en un div que hago visible cuando se pincha en un enlace de la página (mendiante javascript). Lo que ocurre es que al pinchar en alguna de las letras del abecedario que paginan este datagrid el div se vuelve a hacer invisible pues se ejecuta el html de la página. Necesitaría hacerlo visible cada vez que se recuperen nuevos datos para que no sé si se puede hacer. Quiero decir, en el html tengo:
1)<div class="DemoArea" id="divEspecialidad" style="VISIBILITY: visible;...
2)Dentro de ese div está el datagrid
3) Cargando la pagina inicialmente, no se muestran los resultados del datagrid pero si aparecen las casillas dibujadas (porqué?????? quiero que no aparezcan!!)
4)Luego, por javascript ,lo hago visible al pinchar en un enlace
5)Se me muestra el datagrid empezando por los resultados que comienzan con la letra A
4) Si pincho en la letra B el div se oculta ...
  #8 (permalink)  
Antiguo 14/10/2004, 09:02
 
Fecha de Ingreso: agosto-2004
Mensajes: 9
Antigüedad: 19 años, 8 meses
Puntos: 0
Perdon por la primera parte de mi post anterior: Sí se ejecuta la parte *.cs de la página y se muestra el abacedario
Lo único es lo que he comentado al final
El datagrid está contenido en un div que hago visible cuando se pincha en un enlace de la página (mendiante javascript). Lo que ocurre es que al pinchar en alguna de las letras del abecedario que paginan este datagrid el div se vuelve a hacer invisible pues se ejecuta el html de la página. Necesitaría hacerlo visible cada vez que se recuperen nuevos datos y no lo consigo. El htmlo de la pagina tiene:
1)<div class="DemoArea" id="divEspecialidad" style="VISIBILITY: hidden;...
2)Dentro de ese div está el datagrid
3) Cargando la pagina inicialmente, no se muestran los resultados del datagrid pero si aparecen las casillas dibujadas (porqué?????? quiero que no aparezcan!!)
4)Luego, por javascript ,lo hago visible al pinchar en un enlace
5)Se me muestra el datagrid empezando por los resultados que comienzan con la letra A
4) Si pincho en la letra B u otra el div se oculta (imagino que se vuelve a cargar la pagina y toma la instruccion )<div class="DemoArea" id="divEspecialidad" style="VISIBILITY: hidden;...

¿cómo puedo hacer que al recaragarse la pagina bajo demanda de otro bloque de resultados el div sea visible?
¿y cómo puedo hacer para que la primera vez (cuando es invisible) no me pinte las celdas del datagrid? Es decir, cómo hago para que sea invisible ..."del todo" ???
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:17.