none
Error de código para "datos duplicados en datagridview"

    Pregunta

  •  Buenas! 

    Tengo el siguiente código:

    Private Sub CODIGOS_REPETIDOS()
            Dim COLECCION As DataGridViewSelectedRowCollection = FrmAsientoContable.CUENTAS_ASIENTO.SelectedRows
            For Each FILA As DataGridViewRow In COLECCION
                Dim CODIGO As String
                CODIGO = FrmAsientoContable.CUENTAS_ASIENTO(0, FILA.Index).Value

                Dim CELLVALUES As New List(Of String)

                For Each ROW As DataGridViewRow In FrmAsientoContable.CUENTAS_ASIENTO.Rows
                    CELLVALUES.Add(ROW.Cells(0).Value.ToString())
                Next
                Dim EXSITECODIGO As String
                EXISTECODIGO = CELLVALUES.Find(CODIGO) <---- Esta es la linea que tiene el error!

                If EXISTECODIGO Then
                    MsgBox("LA CUENTA YA EXISTE, NO PUEDE SER AGREGADA AL ASIENTO")
                Else
                End If
            Next
        End Sub

    Pero me dice que tengo un error "El valor de tipo 'String' no se puede convertir en 'Predicate(Of String)"

    ¿Alguien podría decirme por que aparece este error?

    Gracias de antemano por tu ayuda... 

    miércoles, 26 de octubre de 2016 1:38

Respuestas

  • Gabriel.Abreu.VisualBasic,

    No me queda del todo claro lo que intentas realizar, por cada fila (de un conjunto de filas seleccionadas) tomas el valor de la primera columna y buscas en todas las filas -de la primera columna- por la existencia del mismo valor y evidentemente la evaluación resultará verdadera porque buscas incluso en las filas seleccionadas.

    Aunque podrías evitar evaluar las filas seleccionadas, te propongo otra forma: realiza la cuenta de las veces que se repite el valor en la columna, si el resultado es mayor a cero queda claro que el valor se ha encontrado una o mas de una vez.

    For Each rowSelected As DataGridViewRow In CUENTAS_ASIENTO.SelectedRows
    	Dim CuentaApariciones As Integer = CUENTAS_ASIENTO.Rows.Cast(Of DataGridViewRow)().
    		Where(Function(x) Convert.ToString(x.Cells(0).Value) =
    		rowSelected.Cells(0).Value.ToString() AndAlso rowSelected.Index <> x.Index).Count()
    
    	If CuentaApariciones > 0 Then
    		MsgBox(String.Format("La cuenta {0} se ha encontrado {1} veces",
    					 rowSelected.Cells(0).Value.ToString(), CuentaApariciones))
    	Else
    		'La cuenta es única, agregar al asiento
    	End If
    Next


    Nota que itero por las filas seleccionadas y por cada fila obtengo la cuenta del mismo valor en todas las filas de la grilla (excepto en la fila seleccionada), si es mayor a cero se emite un mensaje indicando la cuenta repetida y las veces que se repite, caso contrario se agrega la cuenta al asiento.

    No olvides declarar -al inicio del archivo- el espacio de nombres Linq

    Imports System.Linq


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 26 de octubre de 2016 4:45
  • Hola Gabriel.Abreu.VisualBasic,

    Si quieres verificar si un elemento existe en tu lista, deberías usar la función Contains(..) el cual devuelve un valor de tipo Boolean, True si existe y false sino.

    If CELLVALUES.Contains(CODIGO) Then
          MsgBox("LA CUENTA YA EXISTE, NO PUEDE SER AGREGADA AL ASIENTO")
    End If

    O si quieres usar el Predicado de tipo String, podrías usar Exists el cual devuelve un valor Boolean.

     Dim existe = CELLVALUES.Exists(Function(x) x = CODIGO)
    
     If existe Then
         MsgBox("LA CUENTA YA EXISTE, NO PUEDE SER AGREGADA AL ASIENTO")
     End If

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    miércoles, 26 de octubre de 2016 1:57

Todas las respuestas

  • Hola Gabriel.Abreu.VisualBasic,

    Si quieres verificar si un elemento existe en tu lista, deberías usar la función Contains(..) el cual devuelve un valor de tipo Boolean, True si existe y false sino.

    If CELLVALUES.Contains(CODIGO) Then
          MsgBox("LA CUENTA YA EXISTE, NO PUEDE SER AGREGADA AL ASIENTO")
    End If

    O si quieres usar el Predicado de tipo String, podrías usar Exists el cual devuelve un valor Boolean.

     Dim existe = CELLVALUES.Exists(Function(x) x = CODIGO)
    
     If existe Then
         MsgBox("LA CUENTA YA EXISTE, NO PUEDE SER AGREGADA AL ASIENTO")
     End If

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    miércoles, 26 de octubre de 2016 1:57
  • Gabriel.Abreu.VisualBasic,

    No me queda del todo claro lo que intentas realizar, por cada fila (de un conjunto de filas seleccionadas) tomas el valor de la primera columna y buscas en todas las filas -de la primera columna- por la existencia del mismo valor y evidentemente la evaluación resultará verdadera porque buscas incluso en las filas seleccionadas.

    Aunque podrías evitar evaluar las filas seleccionadas, te propongo otra forma: realiza la cuenta de las veces que se repite el valor en la columna, si el resultado es mayor a cero queda claro que el valor se ha encontrado una o mas de una vez.

    For Each rowSelected As DataGridViewRow In CUENTAS_ASIENTO.SelectedRows
    	Dim CuentaApariciones As Integer = CUENTAS_ASIENTO.Rows.Cast(Of DataGridViewRow)().
    		Where(Function(x) Convert.ToString(x.Cells(0).Value) =
    		rowSelected.Cells(0).Value.ToString() AndAlso rowSelected.Index <> x.Index).Count()
    
    	If CuentaApariciones > 0 Then
    		MsgBox(String.Format("La cuenta {0} se ha encontrado {1} veces",
    					 rowSelected.Cells(0).Value.ToString(), CuentaApariciones))
    	Else
    		'La cuenta es única, agregar al asiento
    	End If
    Next


    Nota que itero por las filas seleccionadas y por cada fila obtengo la cuenta del mismo valor en todas las filas de la grilla (excepto en la fila seleccionada), si es mayor a cero se emite un mensaje indicando la cuenta repetida y las veces que se repite, caso contrario se agrega la cuenta al asiento.

    No olvides declarar -al inicio del archivo- el espacio de nombres Linq

    Imports System.Linq


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 26 de octubre de 2016 4:45