ASP.NET – ListView – Hacer una búsqueda

Realizamos una búsqueda mediante un cuadro de texto para filtrar los elementos del ListView:

En la página ASPX:

<p>
         
Aplicar filtro de búsqueda:&nbsp;&nbsp;
          <asp:TextBox ID=»txtFiltro» runat=»server»></asp:TextBox>&nbsp;
          <asp:Button ID=»cmdFiltrar» runat=»server» Text=»Aplicar» OnClick=»Filtrar» />
</
p>
<
asp:ListView Id=”lsvJuegos” runat=”server” DataKeyNames=”IdJuego” DataSourceID=”sqlJuegos” OnItemCommand=”ListadoDeComandos”>
          <LayoutTemplate
>
                   
<asp:PlaceHolder ID=”itemPlaceHolder” runat=”server”></asp:PlaceHolder
>
         
</LayoutTemplate
>
          <ItemTemplate
>
                   
<p><%#Eval(“NombreJuego”)%>
</p>
          </ItemTemplate
>
</asp:ListView>
<asp:Label ID=”lblMensaje” runat=”server”></asp:Label
>
<asp:SqlDataSource ID=”sqlJuegos” runat=”server”></asp:SqlDataSource>

En la página de código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          ‘Enlazar SQL
          sqlJuegos.ConnectionString = «Data Source=.\SQLEXPRESS;AttachDbFilename=’C:\datos\Visual Studio 2008\WebSites\Prueba1\App_Data\Juegos_NDS.mdf’;Integrated Security=True;User Instance=True»
          sqlJuegos.SelectCommand = «SELECT * FROM [Juegos]»
End Sub 
 
Sub Filtrar()
          Dim CriterioDeBusqueda As String
          CriterioDeBusqueda = txtFiltro.Text
          sqlJuegos.SelectCommand =
«SELECT * FROM [Juegos] WHERE NombreJuego LIKE ‘%» & CriterioDeBusqueda & «%'»
          sqlJuegos.DataBind()
End Sub

La búsqueda se hace incremental utilizando la palabra LIKE

 

ASP.NET – ListView – Comando Delete

Lo estrictamente necesario para poder eliminar un registro en un ListView es lo siguiente:

En la página ASPX:

<asp:ListView Id=»lsvJuegos» runat=»server» DataKeyNames=»IdJuego» DataSourceID=»sqlJuegos» OnItemCommand=»ListadoDeComandos»>
          <LayoutTemplate>
                    <asp:PlaceHolder ID=»itemPlaceHolder» runat=»server»></asp:PlaceHolder>
          </LayoutTemplate>
          <ItemTemplate>
                    <p>
                             
<asp:Label ID=»lblIdJuegoMostrando» runat=»server» Text=’<%#Bind(«IdJuego») %> Visible=»false»></asp:Label>
                              <
#Eval(«NombreJuego»)%>&nbsp;&nbsp;
                              <asp:LinkButton ID=»lnkEliminar» runat=»server» CommandName=»EliminarUnRegistro» Text=»Eliminar»></asp:LinkButton>
                    </p>
          </ItemTemplate>
</asp:ListView>
<asp:Label ID=»lblMensaje» runat=»server»></asp:Label>
<asp:SqlDataSource ID=»sqlJuegos» runat=»server»></asp:SqlDataSource>

En la página de código:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          ‘Enlazar SQL
          sqlJuegos.ConnectionString = «Data Source=.\SQLEXPRESS;AttachDbFilename=’C:\datos\Visual Studio 2008\WebSites\Prueba1\App_Data\Juegos_NDS.mdf’;Integrated Security=True;User Instance=True»
          sqlJuegos.SelectCommand = «SELECT * FROM [Juegos]»
End Sub

Sub ListadoDeComandos(ByVal sender As Object, ByVal e As ListViewCommandEventArgs)
          Select Case e.CommandName 
                    Case «EliminarUnRegistro»
                              Dim IdJuego As String = CType(e.Item.FindControl(«lblIdJuegoMostrando»), Object).Text
                              Dim CadenaSQL As String
                              CadenaSQL = «DELETE FROM Juegos WHERE IdJuego=» & IdJuego
                              sqlJuegos.DeleteCommand = CadenaSQL
                              sqlJuegos.Delete()
                              sqlJuegos.DataBind()
          End Select
End Sub

Protected Sub lsvJuegos_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles lsvJuegos.ItemDataBound
          If e.Item.ItemType = ListViewItemType.DataItem Then
                    Dim BotonDeBorrar As LinkButton
                    BotonDeBorrar = e.Item.FindControl(
«lnkEliminar»)
                    If BotonDeBorrar IsNot Nothing Then
                              BotonDeBorrar.Attributes.Add(«onclick», «javascript:return confirm(‘¨Seguro que desea eliminar el registro?’)»)
                    End If
          End If
End Sub

Podréis ver que se pide confirmación al usuario antes de eliminar.

ASP.NET – ListView – Comando Insert

Para insertar un registro en la base de datos desde un ListView tenemos que tener al menos lo siguiente:

En la página ASPX:

 <asp:ListView Id=»lsvJuegos» runat=»server» DataKeyNames=»IdJuego» DataSourceID=»sqlJuegos» OnItemCommand=»ListadoDeComandos»>
          <LayoutTemplate>
                    <asp:PlaceHolder ID=»itemPlaceHolder» runat=»server»></asp:PlaceHolder>
                    <asp:LinkButton ID=»lnkNuevo» runat=»server» Text=»Pulse aqu¡ para añadir un registro» OnClick=»Nuevo»></asp:LinkButton>
          </LayoutTemplate>
          <ItemTemplate>
                    <p><%#Eval(«NombreJuego»)%>&nbsp;&nbsp;</p>
          </ItemTemplate>
          <InsertItemTemplate>
                    <p>
                              <asp:TextBox ID=»txtNombreInsertando» runat=»server»></asp:TextBox>&nbsp;&nbsp;
                              <asp:LinkButton ID=»lnkGuardaInsertando» runat=»server» CommandName=»GuardarInsertando» Text=»Guardar»></asp:LinkButton>&nbsp;
                              <asp:LinkButton ID=»lnkCancelarInsertando» runat=»server» CommandName=»CancelInsertando» Text=»Cancelar»></asp:LinkButton>
                    </p>
          </InsertItemTemplate>
</asp:ListView>
<asp:Label ID=»lblMensaje» runat=»server»></asp:Label>
<asp:SqlDataSource ID=»sqlJuegos» runat=»server»></asp:SqlDataSource>

En la página de código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          ‘Enlazar SQL
          sqlJuegos.ConnectionString = «Data Source=.\SQLEXPRESS;AttachDbFilename=’C:\datos\Visual Studio 2008\WebSites\Prueba1\App_Data\Juegos_NDS.mdf’;Integrated Security=True;User Instance=True»
          sqlJuegos.SelectCommand = «SELECT * FROM [Juegos]»
End Sub 

Sub ListadoDeComandos(ByVal sender As Object, ByVal e As ListViewCommandEventArgs)
          Select Case e.CommandName
                   
Case «GuardarInsertando»
                   
Dim NuevoValor As String = CType(e.Item.FindControl(«txtNombreInsertando»), Object ).Text
                   
Dim CadenaSQL As String
                   
CadenaSQL = «INSERT INTO Juegos (NombreJuego) VALUES (‘» & NuevoValor & «‘)»
                   
sqlJuegos.InsertCommand = CadenaSQL
                    sqlJuegos.Insert()
                    sqlJuegos.DataBind()
                    lsvJuegos.InsertItemPosition = InsertItemPosition.None
                    lsvJuegos.FindControl(
«lnkNuevo»).Visible = True
         
Case «CancelInsertando»
                   
lsvJuegos.InsertItemPosition = InsertItemPosition.None
                    lsvJuegos.FindControl(
«lnkNuevo»).Visible = True
          End Select
End Sub

Sub Nuevo()
          lsvJuegos.InsertItemPosition = InsertItemPosition.LastItem
          lsvJuegos.FindControl(
«lnkNuevo»).Visible = False
End Sub

Tal y como está hecho en este ejemplo existe un enlace que mostrará el cuadro de texto para añadir un registro mediante la primera línea de la subrutina Nuevo al mismo tiempo que el enlace se ocultará. Al guardar o cancelar, se oculta el cuadro de texto y se vuelve a mostrar el enlace mediante las dos líneas siguientes:

          lsvJuegos.InsertItemPosition = InsertItemPosition.None
          lsvJuegos.FindControl(
«lnkNuevo»).Visible = True

 

ASP.NET – ListView – Comando Edit

Para poder Editar los registros de un ListView, tenemos que tener al mínimo el siguiente código:

En la página ASPX:

<asp:ListView Id=»lsvJuegos» runat=»server» DataKeyNames=»IdJuego» DataSourceID=»sqlJuegos» OnItemCommand=»ListadoDeComandos» OnItemEditing=»EditandoRegistro»>
          <LayoutTemplate>
                   
<asp:PlaceHolder ID=»itemPlaceHolder» runat=»server»></asp:PlaceHolder>
         
</LayoutTemplate>
          <ItemTemplate>
                   
<p><%#Eval(«NombreJuego»)%>&nbsp;&nbsp;
                             
<asp:LinkButton ID=»lnkEditar» runat=»server» CommandName=»Edit» Text=»Modificar»></asp:LinkButton>
                   
</p>
          </ItemTemplate>
         
<EditItemTemplate>
                   
<p>
                             
<asp:Label ID=»lblIdJuego» runat=»server» Text=’<%#Bind(«IdJuego») %> Visible=»false»></asp:Label>
                              
<asp:TextBox ID=»txtNombre» runat=»server» Text=’<%#Bind(«NombreJuego») %>‘></asp:TextBox>&nbsp;&nbsp;
                             
<asp:LinkButton ID=»lnkGuardar» runat=»server» CommandName=»Save» Text=»Guardar»></asp:LinkButton>&nbsp;
                             
<asp:LinkButton ID=»lnkCancelar» runat=»server» CommandName=»Cancel» Text=»Cancelar»></asp:LinkButton>
                   
</p>
         
</EditItemTemplate>
</asp:ListView>
<asp:Label ID=»lblMensaje» runat=»server»></asp:Label>
<asp:SqlDataSource ID=»sqlJuegos» runat=»server»></asp:SqlDataSource>

En la página de código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          ‘Enlazar SQL
          sqlJuegos.ConnectionString = «Data Source=.\SQLEXPRESS;AttachDbFilename=’C:\datos\Visual Studio 2008\WebSites\Prueba1\App_Data\Juegos_NDS.mdf’;Integrated Security=True;User Instance=True»
          sqlJuegos.SelectCommand = «SELECT * FROM [Juegos]»
End Sub

Sub EditandoRegistro(ByVal sender As Object, ByVal e As ListViewEditEventArgs)
          lsvJuegos.EditIndex = e.NewEditIndex
End Sub

 Sub ListadoDeComandos(ByVal sender As Object, ByVal e As ListViewCommandEventArgs)
          Select Case e.CommandName
                   
Case «Save»
                             
Dim NuevoValor As String = CType(e.Item.FindControl(«txtNombre»), Object).Text
                             
Dim IdJuego As String
                             
IdJuego = CType(e.Item.FindControl(«lblIdJuego»), Object).Text
                             
Dim CadenaSQL As String
                             
CadenaSQL = «UPDATE Juegos SET NombreJuego='» & NuevoValor & «‘ WHERE IdJuego=» & IdJuego
                              sqlJuegos.UpdateCommand = CadenaSQL
                              sqlJuegos.Update()
                              sqlJuegos.DataBind()
                              lsvJuegos.EditIndex = -1
         
End Select
End Sub

Aquí queda este ejemplo. Como siempre, gracias por vuestros comentarios.

ASP.NET – ListView – Al mínimo

Una de las cosas que me suele ayudar mucho a la hora de meterme con un nuevo control o componente, tal y como lo estoy haciendo ahora con el ListView, es crearlo con su mínima expresión para que funcione. Después ya le iré poniendo todos los añadidos para darle más funcionalidad.

Para que funcione un ListView enlazado a datos, esto es suficiente:

En la página ASPX:

<asp:ListView Id=»lsvJuegos» runat=»server»>
          <LayoutTemplate>
                   
<asp:PlaceHolder ID=»itemPlaceHolder» runat=»server»></asp:PlaceHolder>
          </LayoutTemplate>
          <ItemTemplate>
                    <p><%#Eval(«NombreJuego»)%></p>
          </ItemTemplate>
</asp:ListView>

En la página de código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          ‘Enlazar ListView
         
Dim Con As New Data.SqlClient.SqlConnection
          Con.ConnectionString =
«Data Source=.\SQLEXPRESS;AttachDbFilename=’C:\datos\Visual Studio 2008\WebSites\Prueba1\App_Data\Juegos_NDS.mdf’;Integrated Security=True;User Instance=True»
         
Try
                   
Con.Open()
                   
Dim CadenaSQL As String = «SELECT NombreJuego FROM Juegos»
                   
Dim Adapter As Data.SqlClient.SqlDataAdapter
                    Adapter =
New Data.SqlClient.SqlDataAdapter(CadenaSQL, Con)
                   
Dim dsJuegos As Data.DataSet = New Data.DataSet
                    Adapter.Fill(dsJuegos,
«Juegos»)
                    lsvJuegos.DataSource = dsJuegos.Tables(
«Juegos»)
                    lsvJuegos.DataBind()
          Catch ex As Exception
          
End Try
End Sub

Eso es todo!.

He dejado la cadena de conexión que ha generado el Visual Web Developper Express, ya que me ha parecido interesante.
Es obvio que ha de existir una base de datos con una tabla «Juegos» que incluya un campo «NombreJuego».

Saludos…

ASP.NET – ListView en Visual Studio 2008

COMO REACCIONAR A LOS DIFERENTES EVENTOS QUE SE PRODUCEN EN UN LISTVIEW

Para el ejemplo, tenemos una aplicación que muestra una lista de juegos que tenemos en una base de datos.
Mostraremos en una etiqueta un mensaje de confirmación al añadir, modificar, guardar o eliminar un registro.

En la página ASPX añadimos el ListView con el nombre lsvJuegos.
Activar las opciones de edición, borrado e inserción, para que así nos ponga los correspondientes botones cuyas acciones capturaremos en el evento ItemCommand:
          <asp:Button ID=»DeleteButton» runat=»server» CommandName=»Delete» Text=»Eliminar» />
          <asp:Button ID=»InsertButton» runat=»server» CommandName=»Insert» Text=»Guardar» />
          <asp:Button ID=»EditButton» runat=»server» CommandName=»Edit» Text=»Editar» />
          <asp:Button ID=»UpdateButton» runat=»server» CommandName=»Update» Text=»Guardar» />
          <asp:Button ID=»CancelButton» runat=»server» CommandName=»Cancel» Text=»Cancelar» />
          (he puesto estas líneas para ilustrar el ejemplo pero normalmente se crean automáticamente)

También añadiremos un label:

           <asp:Label ID=»lblMensaje» runat=»server» Text=»» CssClass=»lblMensaje»></asp:Label>

En la página de code-behind escribiremos las siguientes líneas en el evento del ListView ItemCommand():

Protected Sub lsvJuegos_ItemCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewCommandEventArgs) Handles lsvJuegos.ItemCommand
          Dim Mensaje As String = «»
          Select Case e.CommandName
                    Case «Delete»
                              Mensaje = «Registro borrado…»
                    Case «Insert»
                              Mensaje = «Registro añadido…»
                    Case «Edit»
                              Mensaje = «Editando un registro…»
                    Case «Update»
                              Mensaje = «Registro guardado…»
                    Case Else
                              Mensaje = «»
          End Select
          
lblMensaje.Text = Mensaje
End Sub

Con este sencillo procedimiento podemos hacer que al añadir, guardar o eliminar un elemento del listview se cambie el texto de una etiqueta.