CLR: .Net / Mono / Boo / Otros CLR > ASP .NET

 Lanzar Una Pagina Con Condicion

<< < (3/4) > >>

Maxus:
Muchisimas gracias, pero aun no consigo arreglar esto :(

he modificado el codigo y ahora el error es este:

Object reference not set to an instance of an object.

este es el codigo:


--- Código: Text ---foreach (DataListItem dli in DataList1.Items){    HyperLink HLink = new HyperLink();    Label Etiqueta = new Label();     Etiqueta.Text = dli.FindControl(&#34;Contenido&#34;).ToString();     if (Etiqueta.Text == &#34;&#34;)    {        HLink.NavigateUrl = &#34;~/url1.aspx&#34;;        HLink.Text = &#34;URL1&#34;;    }    else    {        HLink.NavigateUrl = &#34;~/url2.aspx&#34;;        HLink.Text = &#34;URL2&#34;;    }} 
Y bueno, hay algo que no consigo entender... es ¿como se asigna el HyperLink a la imagen... ahora mismo no se esta haciendo ¿no?...

Y bueno, desde la vista de diseño si me aparece cada item como un databound....

MUCHAS GRACIAS AMIGO

Javier Santamaria:
Hola Maxus,

Parece que se resiste el tema. A ver que al final sale.

He estado haciendo una prueba y a mi esto me funciona:

Pagina .aspx.cs


--- Código: Text --- using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page {    protected void Page_Load(object sender, EventArgs e)    {        foreach (DataListItem dli in DataList1.Items)        {            Label Etiqueta = new Label();            HyperLink HLink = new HyperLink();            Etiqueta.Text = dli.FindControl(&#34;DestacadoLabel&#34;).ToString();                                    if (Etiqueta.Text == &#34;false&#34;)            {                HLink.NavigateUrl = &#34;~/url1.aspx&#34;;                HLink.Text = &#34;URL1&#34;;            }            else            {                HLink.NavigateUrl = &#34;~/url2.aspx&#34;;                HLink.Text = &#34;URL2&#34;;            }        }    }}  
Pagina .aspx


--- Código: Text --- &#60;%@ Page Language=&#34;C#&#34; AutoEventWireup=&#34;true&#34;  CodeFile=&#34;Default.aspx.cs&#34; Inherits=&#34;_Default&#34; %&#62; &#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD XHTML 1.0 Transitional//EN&#34; &#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#34;&#62; &#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34; &#62;&#60;head runat=&#34;server&#34;&#62;    &#60;title&#62;Untitled Page&#60;/title&#62;&#60;/head&#62;&#60;body&#62;    &#60;form id=&#34;form1&#34; runat=&#34;server&#34;&#62;    &#60;div&#62;        &#60;asp:AccessDataSource ID=&#34;AccessDataSource1&#34; runat=&#34;server&#34; DataFile=&#34;~/dbweb.mdb&#34;            SelectCommand=&#34;SELECT [Zona], [Metros], [Destacado] FROM [Inmueble]&#34;&#62;&#60;/asp:AccessDataSource&#62;        &#60;asp:DataList ID=&#34;DataList1&#34; runat=&#34;server&#34; DataSourceID=&#34;AccessDataSource1&#34;&#62;            &#60;ItemTemplate&#62;                Zona:                &#60;asp:Label ID=&#34;ZonaLabel&#34; runat=&#34;server&#34; Text='&#60;%# Eval(&#34;Zona&#34;) %&#62;'&#62;&#60;/asp:Label&#62;&#60;br /&#62;                Metros:                &#60;asp:Label ID=&#34;MetrosLabel&#34; runat=&#34;server&#34; Text='&#60;%# Eval(&#34;Metros&#34;) %&#62;'&#62;&#60;/asp:Label&#62;&#60;br /&#62;                Destacado:                &#60;asp:Label ID=&#34;DestacadoLabel&#34; runat=&#34;server&#34; Text='&#60;%# Eval(&#34;Destacado&#34;) %&#62;'&#62;&#60;/asp:Label&#62;&#60;br /&#62;                Link:                &#60;asp:HyperLink ID=&#34;HyperLink1&#34; runat=&#34;server&#34;&#62;HyperLink&#60;/asp:HyperLink&#62;&#60;br /&#62;                &#60;br /&#62;            &#60;/ItemTemplate&#62;        &#60;/asp:DataList&#62;&#60;/div&#62;    &#60;/form&#62;&#60;/body&#62;&#60;/html&#62;  
Podrias decir exactamente en que linea te da le error. Es decir, que instruccion intentas ejecutar cuando te salta le error?

Saludos

Maxus:
Muchisimas gracias Javier Santamaria:

Te comento, la linea que me da el error es esta:

            Etiqueta.Text = dli.FindControl("Contenido").ToString();

En mi base de datos tengo varias tablas y a la que hago el SqlDataSource tiene estos campos:

            -idPestana
            -Titulo
            -Contenido
            -Imagen
            -PestanaID

Imaginemos que hago una consulta que me filtrara por PestanaID = 3, bien, el resultado "de ejemplo" seria algo asi:

Registro 1
------------
-idPestana = 53
-Titulo = Ejemplo1
-Contenido = NULL
-Imagen = /imagenes/ima1.jpg
-PestanaID = 3


Registro 2
------------
-idPestana = 65
-Titulo = Ejemplo2
-Contenido = NULL
-Imagen = /imagenes/ima2.jpg
-PestanaID = 3


Registro 3
------------
-idPestana = 91
-Titulo = Ejemplo3
-Contenido = "En este bello paisaje podemos contemplar como ...."
-Imagen = /imagenes/ima3.jpg
-PestanaID = 3


Registro 4
------------
-idPestana = 102
-Titulo = Ejemplo4
-Contenido = NULL
-Imagen = /imagenes/ima4.jpg
-PestanaID = 3


Registro 5
------------
-idPestana = 133
-Titulo = Ejemplo5
-Contenido = NULL
-Imagen = /imagenes/ima5.jpg
-PestanaID = 3


Bien, como sabes tengo 2 tipos de pagina "Pagina para pestañas" y "Pagina para Contenido". Ahora, esta consulta nos ha devuelto 3 registros "imaginarios" y el resultado hubiese quedado en una pagina tipo "Pagina para pestañas" Porque el resultado de la consulta eran mas pestañas... Solo que con una diferencia, ahora hay 5 registros, 4 apuntan a una pagina con mas pestañas y una apunta a una "Pagina para Contenido".

Yo antes los links los hacia con <a href>.... tu propones Hyperlink, el tema es que me gustaria que el link lo tubiese la imagen, es decir, que o bien fuese un imagebutton, o una imagen con un <a href> (en realidad no se me ocurren mas posibilidades).

Tengo una preguntilla. ¿el FindControl, busca el contenido del campo al que haces referencia dentro de la consulta realizada?

En serio, no se como darte las gracias por todo. A ver si no se nos resiste mas y cae este pequeño problema

Gracias a gente como tu, gente como yo salimos de agujeros :D

Muchas gracias de antemano Javier.

Javier Santamaria:
Hola de nuevo, prueba a crearte una aplicacion que simplemente te lea la BD y la meta en el datalist (como he hecho yo en el codigo que te he puesto).

De hecho puedes copiar ese codigo y cambiarle el datasource (en lugar de access haces uno de sql) y cambiar la consulta de seleccion por la que tu necesites.
Te dejo un ejemplo, pero probablemente lo tengas que adaptar (el ejemplo lo baso en el ultimo post). Te pongo los cambios en rojo:

Pagina .aspx

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
   <title>Untitled Page</title>
</head>
<body>
   <form id="form1" runat="server">
   <div>


<asp:SqlDataSource ID="SqlDataSource1" runat="server" DataFile="Tu base de datos"
           SelectCommand="SELECT [idPestana], [Titulo], [Contenido], [Imagen], [PestanaID] FROM [Tu tabla]" WHERE [PestanaID=3]></asp:SqlDataSource>



<asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1">
           <ItemTemplate>


               idPestana:
               <asp:Label ID="idPestanaLabel" runat="server" Text='<%# Eval("idPestana") %>'></asp:Label><br />
               Titulo:
               <asp:Label ID="TituloLabel" runat="server" Text='<%# Eval("Titulo") %>'></asp:Label><br />
               Contenido:
               <asp:Label ID="ContenidoLabel" runat="server" Text='<%# Eval("Contenido") %>'></asp:Label><br />
               Imagen:
               <asp:ImageButton ID="ImagenImageButton" runat="server" Aqui tendras que poner el link de la imagen que quieres mostrar con imageurl></asp:ImageButton><br />





               <br />
               PestanaID:
               <asp:Label ID="PestanaIDLabel" runat="server" Text='<%# Eval("PestanaID") %>'></asp:Label><br />



           </ItemTemplate>
       </asp:DataList></div>
   </form>
</body>
</html>


Pagina .aspx.cs


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
       foreach (DataListItem dli in DataList1.Items)
       {
           Label Etiqueta = new Label();



           Etiqueta.Text = dli.FindControl("ContenidoLabel").ToString();
ImageButton Imagen
Imagen.imageurl =dli.FindControl("ImagenImageButton").imageurl;




           if (Etiqueta.Text == "")
           {
               Lo que quieras hacer"
           }
           else
           {
               Lo que quieras hacer"
           }
       }
   }
}


El FindControl lo que hace es buscarte el control (elemento) que tu le especificas entre parentesis dentro del elemento que le indicas (en tu caso el datalist). Y te devuelve todas las propiedades de ese control para que puedas trabajas con ellas.

Lo de las imagenes creo que con un imagebutton tienes suficiente. Me gusta mas el control web qeu el HTML clasico.

Si te sale haciendolo poco a poco luego intenta integrarlo en tu aplicacion, pero primero prueba con una aplicacion de prueba.  :comp:  :comp:

Saludos

Maxus:
Es muy curioso esto.... en fin... no llego a entenderlo.

mira, este es el codigo del CS:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        foreach (DataListItem dli in DataList1.Items)
        {
            Label Etiqueta = new Label();            
            Etiqueta.Text = dli.FindControl("ContenidoLabel").ToString();

            ImageButton Imagen = new ImageButton();
            Imagen.ImageUrl = dli.FindControl("ImagenImageButton").ToString();

            if ((Etiqueta.Text == "") || (Etiqueta.Text == null))
            {
                Imagen.PostBackUrl = "~/url1.aspx";
            }
            else
            {
                Imagen.PostBackUrl = "~/url2.aspx";
            }
        }
    }
}


y este el del ASPx

    <body>
        <form id="form1" runat="server">
            <div>
           
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                SelectCommand="SELECT [idPestana], [Titulo], [Contenido], [Imagen], [PestanaID] FROM [Pestanas] WHERE PestanaID = 3">
            </asp:SqlDataSource>



            <asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" RepeatColumns="5" RepeatDirection="Horizontal">
                <ItemTemplate>
                    idPestana:
                    <asp:Label ID="idPestanaLabel" runat="server" Text='<%# Eval("idPestana") %>'></asp:Label><br />
                    Titulo:
                    <asp:Label ID="TituloLabel" runat="server" Text='<%# Eval("Titulo") %>'></asp:Label><br />
                    Contenido:
                    <asp:Label ID="ContenidoLabel" runat="server" Text='<%# Eval("Contenido") %>'></asp:Label><br />
                    Imagen:
                    <asp:ImageButton ID="ImagenImageButton" runat="server" ></asp:ImageButton><br />
                    <br />
                    PestanaID:
                    <asp:Label ID="PestanaIDLabel" runat="server" Text='<%# Eval("PestanaID") %>'></asp:Label><br />
                </ItemTemplate>
            </asp:DataList>
                <asp:ImageButton ID="ImageButton1" runat="server" /></div>
    </form>
    </body>


Lo que no entiendo es porque a la hora de hacer la busqueda en el foreach... tengo que poner en el el FindControl ContenidoLabel ¿no seria Contenido?.... si pongo Contenido, me da el error de antes... y sino, pues no da error.

la parte donde digo esto:

            ImageButton Imagen = new ImageButton();
            Imagen.ImageUrl = dli.FindControl("ImagenImageButton").ToString();

No hace lo que tiene que hacer... es decir, coger el valor del campo de la base de datos "Imagen" y ponerselo a Imagen.ImageUrl.... Perdona por mi ignorancia, pero es que no entiendo nada esto que esta pasando...

Prove con tu codigo

            ImageButton Imagen = new ImageButton();
            Imagen.ImageUrl = dli.FindControl("ImagenImageButton").ImageUrl;

Pero no aparece esa propiedad en el control ImagenImageButton.... asi que... pense en hacerle un ToString ... pero el resultado no es lo que espero.

En serio, perdona por mi ignorancia y a ver si conseguimos sacar esto.

Un millon de gracias.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa