elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Evitar datos duplicados en listview
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Evitar datos duplicados en listview  (Leído 11,282 veces)
nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Evitar datos duplicados en listview
« en: 10 Mayo 2015, 00:11 am »

Hola como estan.

Mi consulta es la siquiente tengo un listview y no puedo lograr que no me ingrese datos repetidos



Este es mi codigo. de como ingreso los datos. He probado muchas cosas solo pongo el codigo limpio de como ingreso datos para que me den una idea de como hacer para que no me repita datos.

Código
  1. Private Sub RadButton4_Click(sender As System.Object, e As System.EventArgs) Handles RadButton4.Click
  2.        If txtArticulosPedidos.Text = "" Or rseCantidadPedido.Text = "0" Then
  3.            RadMessageBox.Show(Me, "No ha seleccionado datos", "Información", MessageBoxButtons.OK, RadMessageIcon.Info)
  4.  
  5.        Else
  6.            Dim lvItem1 As New ListViewDataItem() 'Variable para los items
  7.            'Agrega a cada columna valores
  8.            Me.lvListaPedidos.Items.Add(lvItem1)
  9.            lvItem1.Item(0) = txtArticulosPedidos.Text
  10.            lvItem1.Item(1) = rseCantidadPedido.Text
  11.        End If
  12.  
  13.    End Sub

Saludos.


« Última modificación: 10 Mayo 2015, 05:17 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #1 en: 10 Mayo 2015, 03:47 am »

Código
  1. Dim lvItem1 As New ListViewDataItem()
  2.  
  3. 'Estas dos lineas las subi de lugar pues creo que es más entendible así
  4. lvItem1.Item(0) = RadTextBox21.Text
  5. lvItem1.Item(1) = RadSpinEditor1.Text
  6.  
  7. 'Aquí iría la condición
  8.  
  9. Me.RadListView1.Items.Add(lvItem1)
  10.  

Entonces lo que deberías prácticamente es recorrer la colección Items del ListView y ver si existe un ListViewDataItem con esos valores. También puedes hacer uso del método Contains(). Que sería algo como nombreDeTuListView.Items.Contains(listViewItemAComprobar) en un If antes de añadirlo al ListView.

Modifico: Ahh, y lo que tienes que verificar es que el Contains() no se cumpla (devuelva false) antes de añadirlo.

Espero haberte ayudado. Disculpa si no soy más específico en cuanto a sintaxis, pero no estoy tan familiarizado con la sintaxis de VB.NET

PD: Quizás Eleкtro te hecha una mano!

PD: Una sugerencia, deberías usar nombres descriptivos para tus controles y/o variables, de esta manera es más entendible el código


« Última modificación: 10 Mayo 2015, 03:56 am por DarK_FirefoX » En línea

nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #2 en: 10 Mayo 2015, 05:20 am »

Hola gracias por responder ya lo logre si hay otra forma mas eficiente se los agradeceria

Código
  1. Private Sub RadButton4_Click(sender As System.Object, e As System.EventArgs) Handles btnAgregarBoton.Click
  2.        'Verifica que el dato ingresado no exista
  3.        Dim existe As Boolean = False
  4.  
  5.        For Each lvItem1 In lvListaPedidos.Items 'Recorre el listview
  6.            If lvItem1.Item(0) = txtArticulosPedidos.Text Then 'Compara la columna (subitem de la columna)
  7.                existe = True 'Si lo que hay en listview es igual a lo que hay en el artículo ya existe
  8.                Exit For
  9.            End If
  10.        Next
  11.  
  12.        'Si es verdadero se muestra este mensaje
  13.        If existe Then
  14.            MessageBox.Show("el item ya existe")
  15.            Return
  16.        End If
  17.  
  18.        'Si los campos están vacíos no ingresa datos
  19.        If txtArticulosPedidos.Text = "" Or rseCantidadPedido.Text = "0" Then
  20.            RadMessageBox.Show(Me, "No ha seleccionado datos", "Información", MessageBoxButtons.OK, RadMessageIcon.Info)
  21.  
  22.        Else
  23.            Dim lvItem1 As New ListViewDataItem() 'Variable para los items
  24.            'Agrega a cada columna valores
  25.            Me.lvListaPedidos.Items.Add(lvItem1)
  26.            lvItem1.Item(0) = txtArticulosPedidos.Text
  27.            lvItem1.Item(1) = rseCantidadPedido.Text
  28.        End If
  29.  
  30.    End Sub

Saludos!
« Última modificación: 10 Mayo 2015, 05:24 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #3 en: 10 Mayo 2015, 09:09 am »

Antes de nada, cuando formules una pregunta de este tipo asegúrate de aclarar que estás utilizando los componentes de Telerik, que no todo el mundo los conoce y eso puede confundir a los demás.



si hay otra forma mas eficiente se los agradeceria

Lo que estás haciendo con el For Each es una solución efectiva, pero en este caso específico donde solo tienes 2 columnas y quieres que no se repita la columna de artículos, deberías asignarle una llave a cada item con el nombre del artículo, eso lo puedes hacer estableciendo un valor a la propiedad ListViewItem.Name, y luego utilizar la función ListView.Items.ContainsKey para determinar si la llave existe.

VB.Net:
Código
  1.    Private Sub Test() Handles MyBase.Shown
  2.  
  3.        Dim articulo As String = "Clavos"
  4.        Dim cantidad As Integer = 40
  5.  
  6.        Dim lvItem As New ListViewItem({articulo, cantidad.ToString("00")}) With
  7.        {
  8.            .Name = articulo
  9.        }
  10.  
  11.        Me.ListView1.Items.Add(lvItem)
  12.  
  13.    End Sub
  14.  
  15.    Private Sub Button1_Click() Handles Button1.Click
  16.  
  17.        Dim articulo As String = "Clavos"
  18.        Dim cantidad As Integer = 5
  19.  
  20.        If Me.ListView1.Items.ContainsKey(articulo) Then
  21.            MessageBox.Show("El articulo ya existe en la lista.", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
  22.        Else
  23.            ' ...
  24.        End If
  25.  
  26.    End Sub

C-Sharp:
Código
  1. private void Test()
  2. {
  3. string articulo = "Clavos";
  4. int cantidad = 40;
  5.  
  6. ListViewItem lvItem = new ListViewItem({articulo, cantidad.ToString("00")}) { Name = articulo };
  7. this.ListView1.Items.Add(lvItem);
  8. }
  9.  
  10. private void Button1_Click()
  11. {
  12. string articulo = "Clavos";
  13. int cantidad = 5;
  14.  
  15. if (this.ListView1.Items.ContainsKey(articulo)) {
  16. MessageBox.Show("El articulo ya existe en la lista.", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
  17. } else {
  18. // ...
  19. }
  20. }
  21.  
  22. //=======================================================
  23. //Service provided by Telerik (www.telerik.com)
  24. //======================================================

Nota: La función ListView.Items.ContainsKey es case-insensitive, es decir, no distingue entre minúsculas y mayúsculas.



Para un RadListView puedes utilizar la función RadListView.FindItemByKey, para asignar la llave a un item lo puedes hacer estableciendo un valor a la propiedad ListViewDataItem.Key

VB.Net:
Código
  1.    Private Sub Test() Handles MyBase.Shown
  2.  
  3.        Dim articulo As String = "Clavos"
  4.        Dim cantidad As Integer = 40
  5.  
  6.        Dim lvItem As New ListViewDataItem(text:="", values:={articulo, cantidad.ToString("00")}) With
  7.        {
  8.            .Key = articulo
  9.        }
  10.  
  11.        Me.RadListView1.Items.Add(lvItem)
  12.  
  13.    End Sub
  14.  
  15.    Private Sub Button1_Click() Handles Button1.Click
  16.  
  17.        Dim articulo As String = "Clavos"
  18.        Dim cantidad As Integer = 5
  19.  
  20.        If Me.RadListView1.FindItemByKey(key:=articulo, searchVisibleItems:=True) IsNot Nothing Then
  21.            RadMessageBox.Show("El articulo ya existe en la lista.", "", MessageBoxButtons.OK, RadMessageIcon.Error)
  22.        Else
  23.            ' ...
  24.        End If
  25.  
  26.    End Sub

C-Sharp:
Código
  1. private void Test()
  2. {
  3. string articulo = "Clavos";
  4. int cantidad = 40;
  5.  
  6. ListViewDataItem lvItem = new ListViewDataItem(text: "", values: {articulo, cantidad.ToString("00")}) { Key = articulo };
  7. this.RadListView1.Items.Add(lvItem);
  8. }
  9.  
  10. private void Button1_Click()
  11. {
  12. string articulo = "Clavos";
  13. int cantidad = 5;
  14.  
  15. if (this.RadListView1.FindItemByKey(key: articulo, searchVisibleItems: true) != null) {
  16. RadMessageBox.Show("El articulo ya existe en la lista.", "", MessageBoxButtons.OK, RadMessageIcon.Error);
  17. } else {
  18. // ...
  19. }
  20. }
  21.  
  22. //=======================================================
  23. //Service provided by Telerik (www.telerik.com)
  24. //=======================================================

Nota: La función RadListView.FindItemByKey es case-sensitive, es decir, distingue entre minúsculas y mayúsculas.

Saludos
« Última modificación: 10 Mayo 2015, 09:21 am por Eleкtro » En línea



Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #4 en: 10 Mayo 2015, 09:52 am »

También puedes hacer uso del método Contains(). Que sería algo como nombreDeTuListView.Items.Contains(listViewItemAComprobar) en un If antes de añadirlo al ListView.

Cabe mencionar que la función ListView.Items.Contains realiza una comparación de referencias (tanto para un ListView cómo un RadListView, y otros muchos controles de .Net Framework).

¿Que quiere decir esto?, pues que que crear dos instancias del mismo tipo de objeto, en este caso dos ListViewItem distintos que tengan los mismos datos, no los convierte en el mismo objeto, por que tienen referencias distintas.

Ejemplo demostrativo:
Código
  1. Dim articulo As String = "Clavos"
  2. Dim cantidad As Integer = 1
  3.  
  4. Dim lvItem1 As New ListViewItem({articulo, cantidad.ToString("00")})
  5. Dim lvItem2 As New ListViewItem({articulo, cantidad.ToString("00")})
  6.  
  7. Dim areEqual As Boolean = lvItem1.Equals(lvItem2)
  8.  
  9. Debug.WriteLine(String.Format("Son Iguales?: {0}", areEqual))

C#:
Código
  1. string articulo = "Clavos";
  2. int cantidad = 1;
  3.  
  4. ListViewItem lvItem1 = new ListViewItem({articulo, cantidad.ToString("00")});
  5. ListViewItem lvItem2 = new ListViewItem({articulo, cantidad.ToString("00")});
  6.  
  7. bool areEqual = lvItem1.Equals(lvItem2);
  8.  
  9. Debug.WriteLine(string.Format("Son Iguales?: {0}", areEqual));

Saludos!
« Última modificación: 10 Mayo 2015, 10:30 am por Eleкtro » En línea



nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #5 en: 10 Mayo 2015, 10:33 am »

Citar
Antes de nada, cuando formules una pregunta de este tipo asegúrate de aclarar que estás utilizando los componentes de Telerik, que no todo el mundo los conoce y eso puede confundir a los demás.

Lo tendre muy en cuenta.
==============================

Hola estaba probando lo de case sensitive pero todavía no me detecta si la palabra esta en mayus o no.

que estoy haciendo mal.

Código
  1. Dim lvItem1 As New ListViewDataItem()
  2.        lvItem1.Key = txtArticulosPedidos.Text
  3.  
  4.        If Me.lvListaPedidos.FindItemByKey(key:=txtArticulosPedidos.Text, searchVisibleItems:=True) IsNot Nothing Then
  5.            RadMessageBox.Show("El articulo ya existe en la lista.", "", MessageBoxButtons.OK, RadMessageIcon.Error)
  6.        Else
  7.  
  8.            Me.lvListaPedidos.Items.Add(lvItem1)
  9.            lvItem1.Item(0) = txtArticulosPedidos.Text
  10.            lvItem1.Item(1) = rseCantidadPedido.Text
  11.        End If

Saludos Gracias.


« Última modificación: 10 Mayo 2015, 10:49 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #6 en: 10 Mayo 2015, 10:53 am »

No estás haciendo nada mal, simplemente la llave no se encuentra por que las minúsculas/mayúsculas no coinciden, o el texto que estás buscando no existe cómo llave.

Para condicionar el resultado, asigna la llave de los items en minúscula:
Código
  1. Dim articulo As String = "Clavos"
  2. Dim cantidad As Integer = 40
  3.  
  4. Dim lvItem As New ListViewDataItem(text:="", values:={articulo, cantidad.ToString("00")}) With
  5.    { .Key = articulo.Trim.ToLower }
  6.  
  7. Me.RadListView1.Items.Add(lvItem)

Y entonces busca en minúscula:
Código
  1. Dim articulo As String = txtArticulosPedidos.Text.Trim
  2. Dim cantidad As String = Convert.ToInt32(rseCantidadPedido.Text).ToString("00")
  3.  
  4. If Me.lvListaPedidos.FindItemByKey(key:=articulo.ToLower, searchVisibleItems:=True) IsNot Nothing Then
  5.    RadMessageBox.Show("El articulo ya existe en la lista.", "", MessageBoxButtons.OK, RadMessageIcon.Error)
  6. Else
  7.    Dim lvItem As New ListViewDataItem(text:="", values:={articulo, cantidad} with
  8.        { .Key = articulo.ToLower }
  9.    Me.lvListaPedidos.Items.Add(lvItem)
  10. End If

Saludos
« Última modificación: 10 Mayo 2015, 11:01 am por Eleкtro » En línea



nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #7 en: 10 Mayo 2015, 11:06 am »

Muchas gracias Eleкtro

Lo probé de las dos formas y funciona perfecto. Lo entendí todo lo único que investigare es el .trim

Gracias por lo de las llaves, y agregar condiciones a ellas como llaves. (Valga la redundancia)

Saludos  ;-) ;-)

Código
  1. Dim lvItem1 As New ListViewDataItem()
  2.        lvItem1.Key = txtArticulosPedidos.Text.ToLower
  3.  
  4.  
  5.        If Me.lvListaPedidos.FindItemByKey(key:=txtArticulosPedidos.Text.ToLower, searchVisibleItems:=False) IsNot Nothing Then
  6.            RadMessageBox.Show("El articulo ya existe en la lista.", "", MessageBoxButtons.OK, RadMessageIcon.Error)
  7.        Else
  8.            Me.lvListaPedidos.Items.Add(lvItem1)
  9.            lvItem1.Item(0) = txtArticulosPedidos.Text
  10.            lvItem1.Item(1) = rseCantidadPedido.Text
  11.        End If

Veo que quito este, lo dejo por si a alquien le sirve de esta forma lo entendi. : ). ahora vere el que modifico

Código
  1. Dim key As String = txtArticulosPedidos.Text.Trim
  2.  
  3.        If Me.lvListaPedidos.FindItemByKey(key:=key.ToLower, searchVisibleItems:=True) IsNot Nothing Then
  4.            RadMessageBox.Show("El articulo ya existe en la lista.", "", MessageBoxButtons.OK, RadMessageIcon.Error)
  5.        Else
  6.            Dim lvItem1 As New ListViewDataItem
  7.            lvItem1.Key = key.ToLower
  8.            Me.lvListaPedidos.Items.Add(lvItem1)
  9.            lvItem1.Item(0) = key
  10.            lvItem1.Item(1) = rseCantidadPedido.Text
  11.        End If

Falto ) despues de }
Código
  1. Dim lvItem As New ListViewDataItem(text:="", values:={articulo, cantidad} with

Código
  1. 'Dim cantidad As String = Convert.ToInt32(rseCantidadPedido.Text).ToString("00")

Gracias le da un mejor formato a la cantidad vere si no me causa problema en la BD ya que si no me equivoco lo manda como string.



Muchas gracias de nuevo Eleкtro
« Última modificación: 10 Mayo 2015, 12:05 pm por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #8 en: 10 Mayo 2015, 11:54 am »

Parezco retrasado, estoy viendo todo el rato que publicas código en VB.Net pero yo tenía metido en la cabeza que solo manejabas C# por que te confundí con otro usuario y por eso te puse el código en C# aunque solo veia Vb.Net, no era por "presumir" ni nada parecido jaja, el código en C# la verdad es que quedó de más.



investigare es el .trim

La función Trim, TrimStart y TrimEnd lo que hacen es eliminar los espacios del principio o del final de un String, pero puedes utilizar sus overloads para especificar otros (uno, o varios) caracteres a eliminar.

En el ejemplo de arriba yo solo utilizo Trim cómo modo preventivo por si a lo mejor en tu aplicación te estaba fallando por que escribias algún espacio al principio o al final.



Código
  1. 'Dim cantidad As String = Convert.ToInt32(rseCantidadPedido.Text).ToString("00")

Gracias le da un mejor formato a la cantidad vere si no me causa problema en la BD ya que si no me equivoco lo manda como string.

Si quieres enviarlo a la DataBase como valor de tipo Integer entonces solo tienes que convertir el string formateado:
Código
  1. Dim value as Integer = CInt("05")
o también:
Código
  1. Dim value as Integer = Convert.ToInt32("05")

Saludos
« Última modificación: 10 Mayo 2015, 12:00 pm por Eleкtro » En línea



DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Evitar datos duplicados en listview
« Respuesta #9 en: 10 Mayo 2015, 15:42 pm »

Cabe mencionar que la función ListView.Items.Contains realiza una comparación de referencias (tanto para un ListView cómo un RadListView, y otros muchos controles de .Net Framework).

¿Que quiere decir esto?, pues que que crear dos instancias del mismo tipo de objeto, en este caso dos ListViewItem distintos que tengan los mismos datos, no los convierte en el mismo objeto, por que tienen referencias distintas.

Ejemplo demostrativo:
Código
  1. Dim articulo As String = "Clavos"
  2. Dim cantidad As Integer = 1
  3.  
  4. Dim lvItem1 As New ListViewItem({articulo, cantidad.ToString("00")})
  5. Dim lvItem2 As New ListViewItem({articulo, cantidad.ToString("00")})
  6.  
  7. Dim areEqual As Boolean = lvItem1.Equals(lvItem2)
  8.  
  9. Debug.WriteLine(String.Format("Son Iguales?: {0}", areEqual))

C#:
Código
  1. string articulo = "Clavos";
  2. int cantidad = 1;
  3.  
  4. ListViewItem lvItem1 = new ListViewItem({articulo, cantidad.ToString("00")});
  5. ListViewItem lvItem2 = new ListViewItem({articulo, cantidad.ToString("00")});
  6.  
  7. bool areEqual = lvItem1.Equals(lvItem2);
  8.  
  9. Debug.WriteLine(string.Format("Son Iguales?: {0}", areEqual));

Saludos!

Tienes toda la razón. Entendido, la verdad no se porque cometí ese error! xD

Por otro lado:

Cita de: Eleкtro
Parezco retrasado, estoy viendo todo el rato que publicas código en VB.Net pero yo tenía metido en la cabeza que solo manejabas C# por que te confundí con otro usuario y por eso te puse el código en C# aunque solo veia Vb.Net, no era por "presumir" ni nada parecido jaja, el código en C# la verdad es que quedó de más.

Agradezco que hayas publicado también el código en C#, yo soy el que maneja C# y no VB.NET, quizás por eso lo hiciste. Gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines