none
Evitar escojer el mismo item en datagridview

    Pregunta

  • Muy buenas tengo un problema me gustaria que me pudieran ayudar tengo este codigo con el que lleno una columna del datagridview.

    Dim dt As New DataTable
                Dim da As New SqlDataAdapter
    
                Dim conn As String = ConfigurationManager.ConnectionStrings("default").ToString
    
                Using cn As New SqlConnection(conn)
    
                    cn.Open()
    
                    Using cmd As SqlCommand = cn.CreateCommand
    
                        cmd.CommandText = "SELECT CodigoProducto FROM Producto"
    
                        dt = New DataTable
                        da = New SqlDataAdapter(cmd)
                        da.Fill(dt)
    
                    End Using
    
                End Using
    
                    Dim stringCol As New AutoCompleteStringCollection()
    
                    For Each item As DataRow In dt.Rows
    
                        stringCol.Add(item("CodigoProducto"))
    
                    Next
    
                Dim comboCol = TryCast(e.Control, TextBox)
                comboCol.AutoCompleteCustomSource = stringCol
                comboCol.AutoCompleteMode = AutoCompleteMode.SuggestAppend
                comboCol.AutoCompleteSource = AutoCompleteSource.CustomSource

    esto lo tengo en el evento EditingControlShowing...

    Y al escribir se despliega una lista con los productos segun la letra introducida en la celda del datagrid y traigo los datos para llenar las demas celdas el problema es q no me debe escojer 2 veces el mismo item

    Espero que puedan darme una guia de como deberia hacerlo

    gracias y saludos..

    jueves, 1 de diciembre de 2016 0:17

Respuestas

  • Hola JOSÉ251288,

    Puedes usar el evento CellValidating para validar si el valor de la celda en edición ya existe o no.

    Algo como :

    Private Sub DataGridView1_CellValidating(sender As Object, e .......
        Dim dgv = CType(sender, DataGridView)
    
        If dgv.Columns(e.ColumnIndex).Name = "Codigo" Then
            Dim existe As Boolean = dgv.Rows.OfType(Of DataGridViewRow).
                    Any(Function(x) x.Index <> e.RowIndex And
                           CStr(x.Cells(e.ColumnIndex).Value) = e.FormattedValue.ToString())
    
            e.Cancel = existe = True
            dgv.Rows(e.RowIndex).ErrorText = If(existe, "El código ya se encuentra registrado", String.Empty)
        End If
    
    End Sub

    Resultado : Mostrará un mensaje y no permitirá salir de la celda hasta no corregir la validación.

    O también podrías evitar no desplegar los códigos ya existentes en el DataGridView al momento de usar el evento EditingControlShowing.

    Algo como :

    For Each item As DataRow In dt.Rows
        Dim existe As Boolean = CType(sender, DataGridView).Rows.OfType(Of DataGridViewRow).
                            Any(Function(x) CStr(x.Cells("Codigo").Value) = item("CodigoProducto").ToString())
    
        'Si no existe en el DGV agrega como autocompletado
        If Not existe Then
            stringCol.Add(item("CodigoProducto").ToString())
        End If
    Next

    Dónde : 'Codigo' es el nombre de mi columna en el DataGridView.

    Resultado : Lista con todos los datos.

    - Listado con solo los valores que no existen en el DGV :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta JOSÉ251288 jueves, 1 de diciembre de 2016 3:17
    jueves, 1 de diciembre de 2016 1:13

Todas las respuestas

  • Hola JOSÉ251288,

    Puedes usar el evento CellValidating para validar si el valor de la celda en edición ya existe o no.

    Algo como :

    Private Sub DataGridView1_CellValidating(sender As Object, e .......
        Dim dgv = CType(sender, DataGridView)
    
        If dgv.Columns(e.ColumnIndex).Name = "Codigo" Then
            Dim existe As Boolean = dgv.Rows.OfType(Of DataGridViewRow).
                    Any(Function(x) x.Index <> e.RowIndex And
                           CStr(x.Cells(e.ColumnIndex).Value) = e.FormattedValue.ToString())
    
            e.Cancel = existe = True
            dgv.Rows(e.RowIndex).ErrorText = If(existe, "El código ya se encuentra registrado", String.Empty)
        End If
    
    End Sub

    Resultado : Mostrará un mensaje y no permitirá salir de la celda hasta no corregir la validación.

    O también podrías evitar no desplegar los códigos ya existentes en el DataGridView al momento de usar el evento EditingControlShowing.

    Algo como :

    For Each item As DataRow In dt.Rows
        Dim existe As Boolean = CType(sender, DataGridView).Rows.OfType(Of DataGridViewRow).
                            Any(Function(x) CStr(x.Cells("Codigo").Value) = item("CodigoProducto").ToString())
    
        'Si no existe en el DGV agrega como autocompletado
        If Not existe Then
            stringCol.Add(item("CodigoProducto").ToString())
        End If
    Next

    Dónde : 'Codigo' es el nombre de mi columna en el DataGridView.

    Resultado : Lista con todos los datos.

    - Listado con solo los valores que no existen en el DGV :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta JOSÉ251288 jueves, 1 de diciembre de 2016 3:17
    jueves, 1 de diciembre de 2016 1:13
  • Perfecto justo lo que necesitaba muchas gracias es algo de vida o muerte jajaja
    jueves, 1 de diciembre de 2016 3:18