none
Filtrar DataGridView con un Dataview RRS feed

  • Pregunta

  • Hola que tal ahora con otra dudilla que me trae loco, haber que estoy haciendo mal. Tratare de darme a entender lo mas que se pueda.

      Dim cadconex As String = "Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source = " & Me.txtarchivo.Text.Trim & " ;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"""
                Dim cn As New OleDb.OleDbConnection(cadconex)
                Dim cmd As New OleDbCommand
                Dim da As New OleDb.OleDbDataAdapter
                Dim dt As New DataTable
    
                cmd.Connection = cn
                'Consultamos la hoja llamada Tabuladores de nuestro archivo *.xls
                cmd.CommandText = "SELECT UCASE(clave_sistema) AS clavesis, UCASE(sistema) AS sis, UCASE(número) AS nume, UCASE(clave) AS cla, UCASE(descripción) AS descr, horas, precio  FROM [Tabuladores$] WHERE CLAVE_SISTEMA<>'" & 0 & "'"
                cmd.CommandType = CommandType.Text
                da.SelectCommand = cmd
                'Llenamos el datatable
                da.Fill(dt)
                Dim view As DataView = New DataView(dt)
                Dim dtSinDuplicados As DataTable
                dtSinDuplicados = view.ToTable(True,"clavesis")
                dgvimportacion.DataSource = (dtSinDuplicados)

    Llenamos el dataadapter con el datatable, ese datatable se lo asignamos al dataview, ese dataview le decimos que es un datatable y lo filtramos por la columna de "clavesis", una vez filtrado lo pasamos al datagridview AQUI ES DONDE ESTA EL DETALLE ya que solo me muestra la columna clavesis y las demas no, POR EJEMPLO:

    clavesis  sistem  nume  clav  hrs  precio

    123

    ABC

    252

     en que estare mal, les agradeceria si me pudieran ayudar...

    viernes, 1 de marzo de 2013 6:06

Respuestas

  • "saulini" escribió:

    > en si lo que debe de filtrar es para evitar filas duplicadas dependiendo
    > de la columna clavesis, el codigo anterior si me filtra y me elimina
    > columnas duplicadas pero como te comento solo esa columna, ahora quiero
    > que me muestre los demas datos dependiendo de esa columna filtrada.
    >

    Yo creo que NO NOS ENTENDEMOS. :-(

    > Estoy intentando hacerlo de otra forma pero me gustaría saber si se puede
    > realizar de esta manera
    >
    >  dtSinDuplicados = view.ToTable(True,"clavesis")   

    Eso ya lo comentaste en tu primer mensaje, y te vuelvo a repetir que lo que tú pretendes conseguir NO SE PUEDE HACER, porque para evitar filas duplicadas, todos los valores de los campos o columnas de esas filas TIENEN QUE SER IGUALES, y tú, lo único que tienes igual es el valor de la columna clave_sistema, alias clavesis, por tanto, tienes que responder a la pregunta que te formulé anteriormente: ¿con qué registro de los siguientes te quedarías?

        123  1  1  A1  2  22.50
        123  1  2  B1  3  5.60

    ¿Con el que tiene el valor menor o mayor en el campo número? Es decir, ¿con la primera o con la segunda fila? Te podrías quedar con la fila que creas conveniente, pero ¿eso es realmente lo que deseas obtener? ¿Una fila cualquiera sin importar los datos que tienen las demás columnas?

    Aparte, anteriormente te he efectuado otra pregunta, y parece ser que no has hecho ni caso. No obstante, te la vuelvo a repetir: ¿los campos número y clave tienen valores únicos en todas las filas?

    Si la respuesta es afirmativa, deberías de FILTRAR LAS FILAS (no las columnas) por el valor de alguno de esos campos, es decir, algo parecido a rellenar un objeto DataTable como resultado de ejecutar la siguiente consulta SQL de selección:

       cmd.CommandText = "SELECT * FROM [Tabuladores$] " & _
                         "WHERE [número] = '1'"

    Con ésta consulta, solamente recuperarás la siguiente fila:

        123  1  1  A1  2  22.50

    Y si especificas como valor el número 2, obtendrías la segunda fila:

        123  1  2  B1  3  5.60

    Pero si solamente tienes el valor 123 correspondiente al campo clavesis, ¿qué fila deseas recuperar filtrando por ese campo si EXISTEN DOS O MÁS FILAS CON EL MISMO VALOR?

    Creo que te deberías de replantear mejor lo que deseas hacer.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción 

    Hola Enrique gracias por tomarte la molestia de ayudarme y déjame decirte que logre conseguir lo que queria tal vez no fui muy explisito o no me di a entender pero voy a compartirlo por si a alguien le sirve de la manera que lo hago.

    For Each fila As DataRow In datossin.Rows 'creamos un contador Dim cont As Integer 'asignamos a nuestra variable el valor del primer registro del datatable Dim valor As String = fila("cla").ToString() 'iniciamos el recorrido del datagridview para encontrar coincidencias en la columna For i As Integer = 0 To dgvimportacion.Rows.Count - 1

      Dim x As Integer = i + 1 'le asignamos a nuestra variable el valor de la columna a evaluar Dim claveb As String = dgvimportacion.Rows(i).Cells(3).Value.ToString() 'verificamos si coinciden nuestros valores If valor = claveb Then cont = cont + 1 End If ' si encuentra otra coincidencia el contador se incrementa, si se cumple la ondicion ejecuta la sentencia If cont = 2 Then KryptonMessageBox.Show("Existen registros duplicados en la fila " & x & "") 'borrar el datatable Dim dr As DataTable = CType(dgvimportacion.DataSource, DataTable) dr.Rows.Clear() dgvimportacion.DataSource = dr Me.txtarchivo.Clear() Exit For End If Next cont = 0 Next

    esto lo hice por que el datagridview se carga con datos de una hoja de excel si existen duplicados no deja que los cargue hasta que eliminen los duplicados en dicha hoja.

    Tome los datos de un dataview filtrado por la columna cla, para evitar duplicados y asi puede comparar con los datos del datagridview.

    Tratare de mejorar el código, muchas gracias a los que se tomaron las molestias de ayudarme créanme que me sirvió de mucho, así es esto de la programación divertida y engorrosa en ocasiones.

     Se aceptan sugerencias para mejorar el código. Saludos.


    • Marcado como respuesta saulini domingo, 3 de marzo de 2013 20:29
    • Editado saulini domingo, 3 de marzo de 2013 20:31
    domingo, 3 de marzo de 2013 20:29

Todas las respuestas

  • "saulini" preguntó:

    > ... una vez filtrado lo pasamos al datagridview AQUI ES DONDE ESTA
    > EL DETALLE ya que solo me muestra la columna clavesis
    > en que estare mal

    Se muestra sólo la columna 'clavesis' porque así se lo estás diciendo tú que lo haga cuando ejecutas

        dtSinDuplicados = view.ToTable(True,"clavesis")

    Si deseas que se muestren más columnas, al método ToTable le tendrás que pasar un array con el nombre de las columnas que deseas mostrar. Por ejemplo, para mostrar todas las columnas del objeto DataTable, ejecutarías:

                    'Llenamos el datatable
                    da.Fill(dt)
                    Dim view As DataView = New DataView(dt)
    
                    ' Ejecutamos una consulta LINQ para recuperar
                    ' el nombre de las columnas.
                    Dim query As IEnumerable(Of String) = _
                        From colum As DataColumn In dt.Columns.OfType(Of DataColumn)() _
                        Select colum.ColumnName
    
                    ' Array con los nombres de las columnas
                    '
                    Dim columnNames() As String = query.ToArray()
                   
                    Dim dtSinDuplicados As DataTable = view.ToTable(True, columnNames)
    
                    DataGridView1.DataSource = dtSinDuplicados

    De todas maneras te comento que no sé muy bien para qué quieres hacer esto, porque si en el asunto de tu mensaje hablas de Filtrar un control DataGridView con un objeto DataView, entiendo que lo que deseas filtrar son las filas, no las columnas, y para filtrar las filas tienes que hacer uso de la propiedad RowFilter del objeto DataView.

    Y si lo que deseas es filtrar las columnas, lo que tienes que hacer es especificar los nombres exactos de las columnas que deseas recuperar en la consulta SQL de selección con la que cargas el objeto DataTable.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.



    viernes, 1 de marzo de 2013 12:25
    Moderador
  • yo para filtrar un datagrid con un dataview lo hago de esta manera

    dim consulta as string ="Selec * from tabla"
    dim cn as new sqlconection (Cadena de conexion)
    dim da as new sqldataadapter (consulta, cn)
    dim ds as new dataset
    dim dv as new dataview
    
    If cn.State = ConnectionState.Closed Then cn.Open()
    da.fill (ds)
    dv.table = ds.tables(0)
    datagridview1.datasource= dv
    dv.rowfilter = string.format ("Campo like '"&textbox1.text &"'")
    
    cn.close
    de esta manera a mi se me hace mas facil filtrar datagrid con un dataview,


    viernes, 1 de marzo de 2013 15:15
  • hola que tal si de hecho lo que quiero es que me filtre las filas por columnas o no se si este mal planteado lo que quiero hacer te pongo un ejemplo para filtrar EL DATATABLE por clavesis para que no salgan duplicados

    clavesis  sistem  nume  clav   hrs    precio

    123 1    1         A1     2      22.50    

    123           1 2 B1 3 5.60 

    ABC       HID    3       C1    2.5    15.20   

    252      HGH     4     D1    4.5    22.60   

    en el datagridview deberia de quedar lo siguiente eliminando uno de los duplicados de clavesis no se si me explique bien, gracias por responder

    clavesis  sistem  nume  clav   hrs    precio

    123 1    1       A1    2    22.50

    ABC       HID    3       C1    2.5    15.20

    252      HGH    4     D1    4.5    22.60


    • Editado saulini viernes, 1 de marzo de 2013 17:12
    viernes, 1 de marzo de 2013 17:04
  • el problema es que no tengo un textbox para filtrar si no es un datatable y deceo filtrar para evitar duplicados ya que es una hoja de excel de la cual tomo el datatable pero lo tomare en cuenta para futuras consultas jeje gracias

    viernes, 1 de marzo de 2013 17:06
  • "saulini" preguntó:

    > ... una vez filtrado lo pasamos al datagridview AQUI ES DONDE ESTA
    > EL DETALLE ya que solo me muestra la columna clavesis
    > en que estare mal

    Se muestra sólo la columna 'clavesis' porque así se lo estás diciendo tú que lo haga cuando ejecutas

        dtSinDuplicados = view.ToTable(True,"clavesis")

    Si deseas que se muestren más columnas, al método ToTable le tendrás que pasar un array con el nombre de las columnas que deseas mostrar. Por ejemplo, para mostrar todas las columnas del objeto DataTable, ejecutarías:

                    'Llenamos el datatable
                    da.Fill(dt)
                    Dim view As DataView = New DataView(dt)
    
                    ' Ejecutamos una consulta LINQ para recuperar
                    ' el nombre de las columnas.
                    Dim query As IEnumerable(Of String) = _
                        From colum As DataColumn In dt.Columns.OfType(Of DataColumn)() _
                        Select colum.ColumnName
    
                    ' Array con los nombres de las columnas
                    '
                    Dim columnNames() As String = query.ToArray()
                   
                    Dim dtSinDuplicados As DataTable = view.ToTable(True, columnNames)
    
                    DataGridView1.DataSource = dtSinDuplicados

    De todas maneras te comento que no sé muy bien para qué quieres hacer esto, porque si en el asunto de tu mensaje hablas de Filtrar un control DataGridView con un objeto DataView, entiendo que lo que deseas filtrar son las filas, no las columnas, y para filtrar las filas tienes que hacer uso de la propiedad RowFilter del objeto DataView.

    Y si lo que deseas es filtrar las columnas, lo que tienes que hacer es especificar los nombres exactos de las columnas que deseas recuperar en la consulta SQL de selección con la que cargas el objeto DataTable.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción 



    ok Enrique ya tengo la columna clavesis filtrada lo que necesitaria ahora es recuperar la fila completa  sistem nume clav hrs precio correspondiente a cada clavesis filtrado
    viernes, 1 de marzo de 2013 21:25
  • "saulini" escribió:

    > ok Enrique ya tengo la columna clavesis filtrada lo que necesitaria
    > ahora es recuperar la fila completa  sistem nume clav hrs precio
    > correspondiente a cada clavesis filtrado

    ¿Que tienes la columna clavesis filtrada? Y obviamente, se supone que yo tengo que "adivinar" cómo la has filtrado, ya que no has publicado el código que has ejecutado para realizar tal filtración. :-(

    Si no es mucho preguntar, ¿me puedes decir cómo la has filtrado? Te lo pregunto porque si yo he entendido bien lo que deseas lograr, NO SE PUEDEN OBTENER FILAS ÚNICAS, al menos no como tú pretendes lograrlo, salvo que selecciones solamente el campo clavesis utilizando el predicado DISTINCT:

        cmd.CommandText = "SELECT DISTINCT clave_sistema AS clavesis, COUNT(*) AS Total " & _
                          "FROM [Tabuladores$] " & _
                          "WHERE Not clave_sistema Is NULL " & _
                          "GROUP BY clave_sistema " & _
                          "ORDER BY clave_sistema"

    > si de hecho lo que quiero es que me filtre las filas por columnas

    Que yo sepa a eso se le llama FILTRAR POR FILAS, ya que pretendes seleccionar un único registro o fila donde el valor de la columna clavesis se repita.

    Y llegado a éste punto, la pregunta sería, ¿con qué registro de los siguientes te quedarías?

       123  1  1  A1  2  22.50
       123  1  2  B1  3  5.60

    ¿Con el que tiene el valor menor o mayor en el campo número? Es decir, ¿con la primera o con la segunda fila?

    Asi que dime cómo has filtrado la columna clavesis porque yo soy incapaz de hacerlo, al menos de una manera directa. ;-)

    Otra pregunta: ¿los campos número y clave tienen valores únicos en todas las filas?

    NOTA: si todavía estás a tiempo, no estaría de más que le quitaras los acentos a los nombres de las columnas, porque entonces los tienes que encerrar entre corchetes:

      cmd.CommandText = "SELECT clave_sistema AS clavesis, " & _
                        "sistema AS sis, [número] AS nume, clave AS cla, " & _
                        "[descripción] AS descr, horas, precio " & _
                        "FROM [Tabuladores$] " & _
                        "WHERE Not clave_sistema Is NULL " & _
                        "ORDER BY clave_sistema"
    
     
    
     

     

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    sábado, 2 de marzo de 2013 6:34
    Moderador
  • "saulini" escribió:

    > ok Enrique ya tengo la columna clavesis filtrada lo que necesitaria
    > ahora es recuperar la fila completa  sistem nume clav hrs precio
    > correspondiente a cada clavesis filtrado

    ¿Que tienes la columna clavesis filtrada? Y obviamente, se supone que yo tengo que "adivinar" cómo la has filtrado, ya que no has publicado el código que has ejecutado para realizar tal filtración. :-(

    Si no es mucho preguntar, ¿me puedes decir cómo la has filtrado? Te lo pregunto porque si yo he entendido bien lo que deseas lograr, NO SE PUEDEN OBTENER FILAS ÚNICAS, al menos no como tú pretendes lograrlo, salvo que selecciones solamente el campo clavesis utilizando el predicado DISTINCT:

        cmd.CommandText = "SELECT DISTINCT clave_sistema AS clavesis, COUNT(*) AS Total " & _
                          "FROM [Tabuladores$] " & _
                          "WHERE Not clave_sistema Is NULL " & _
                          "GROUP BY clave_sistema " & _
                          "ORDER BY clave_sistema"

    > si de hecho lo que quiero es que me filtre las filas por columnas

    Que yo sepa a eso se le llama FILTRAR POR FILAS, ya que pretendes seleccionar un único registro o fila donde el valor de la columna clavesis se repita.

    Y llegado a éste punto, la pregunta sería, ¿con qué registro de los siguientes te quedarías?

       123  1  1  A1  2  22.50
       123  1  2  B1  3  5.60

    ¿Con el que tiene el valor menor o mayor en el campo número? Es decir, ¿con la primera o con la segunda fila?

    Asi que dime cómo has filtrado la columna clavesis porque yo soy incapaz de hacerlo, al menos de una manera directa. ;-)

    Otra pregunta: ¿los campos número y clave tienen valores únicos en todas las filas?

    NOTA: si todavía estás a tiempo, no estaría de más que le quitaras los acentos a los nombres de las columnas, porque entonces los tienes que encerrar entre corchetes:

      cmd.CommandText = "SELECT clave_sistema AS clavesis, " & _
                        "sistema AS sis, [número] AS nume, clave AS cla, " & _
                        "[descripción] AS descr, horas, precio " & _
                        "FROM [Tabuladores$] " & _
                        "WHERE Not clave_sistema Is NULL " & _
                        "ORDER BY clave_sistema"
    
     
    
     

     

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict


    HOla de nuevo Enrique, si una disculpa por no poner como debía de filtrar, en si lo que debe de filtrar es para evitar filas duplicadas dependiendo de la columna clavesis, el codigo anterior si me filtra y me elimina columnas duplicadas pero como te comento solo esa columna, ahora quiero que me muestre los demas datos dependiendo de esa columna filtrada.

    Estoy intentando hacerlo de otra forma pero me gustaría saber si se puede realizar de esta manera

    dtSinDuplicados = view.ToTable(True,"clavesis")

    sábado, 2 de marzo de 2013 18:43
  • "saulini" escribió:

    > en si lo que debe de filtrar es para evitar filas duplicadas dependiendo
    > de la columna clavesis, el codigo anterior si me filtra y me elimina
    > columnas duplicadas pero como te comento solo esa columna, ahora quiero
    > que me muestre los demas datos dependiendo de esa columna filtrada.
    >

    Yo creo que NO NOS ENTENDEMOS. :-(

    > Estoy intentando hacerlo de otra forma pero me gustaría saber si se puede
    > realizar de esta manera
    >
    >  dtSinDuplicados = view.ToTable(True,"clavesis")   

    Eso ya lo comentaste en tu primer mensaje, y te vuelvo a repetir que lo que tú pretendes conseguir NO SE PUEDE HACER, porque para evitar filas duplicadas, todos los valores de los campos o columnas de esas filas TIENEN QUE SER IGUALES, y tú, lo único que tienes igual es el valor de la columna clave_sistema, alias clavesis, por tanto, tienes que responder a la pregunta que te formulé anteriormente: ¿con qué registro de los siguientes te quedarías?

        123  1  1  A1  2  22.50
        123  1  2  B1  3  5.60

    ¿Con el que tiene el valor menor o mayor en el campo número? Es decir, ¿con la primera o con la segunda fila? Te podrías quedar con la fila que creas conveniente, pero ¿eso es realmente lo que deseas obtener? ¿Una fila cualquiera sin importar los datos que tienen las demás columnas?

    Aparte, anteriormente te he efectuado otra pregunta, y parece ser que no has hecho ni caso. No obstante, te la vuelvo a repetir: ¿los campos número y clave tienen valores únicos en todas las filas?

    Si la respuesta es afirmativa, deberías de FILTRAR LAS FILAS (no las columnas) por el valor de alguno de esos campos, es decir, algo parecido a rellenar un objeto DataTable como resultado de ejecutar la siguiente consulta SQL de selección:

       cmd.CommandText = "SELECT * FROM [Tabuladores$] " & _
                         "WHERE [número] = '1'"

    Con ésta consulta, solamente recuperarás la siguiente fila:

        123  1  1  A1  2  22.50

    Y si especificas como valor el número 2, obtendrías la segunda fila:

        123  1  2  B1  3  5.60

    Pero si solamente tienes el valor 123 correspondiente al campo clavesis, ¿qué fila deseas recuperar filtrando por ese campo si EXISTEN DOS O MÁS FILAS CON EL MISMO VALOR?

    Creo que te deberías de replantear mejor lo que deseas hacer.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    domingo, 3 de marzo de 2013 7:46
    Moderador
  • "saulini" escribió:

    > en si lo que debe de filtrar es para evitar filas duplicadas dependiendo
    > de la columna clavesis, el codigo anterior si me filtra y me elimina
    > columnas duplicadas pero como te comento solo esa columna, ahora quiero
    > que me muestre los demas datos dependiendo de esa columna filtrada.
    >

    Yo creo que NO NOS ENTENDEMOS. :-(

    > Estoy intentando hacerlo de otra forma pero me gustaría saber si se puede
    > realizar de esta manera
    >
    >  dtSinDuplicados = view.ToTable(True,"clavesis")   

    Eso ya lo comentaste en tu primer mensaje, y te vuelvo a repetir que lo que tú pretendes conseguir NO SE PUEDE HACER, porque para evitar filas duplicadas, todos los valores de los campos o columnas de esas filas TIENEN QUE SER IGUALES, y tú, lo único que tienes igual es el valor de la columna clave_sistema, alias clavesis, por tanto, tienes que responder a la pregunta que te formulé anteriormente: ¿con qué registro de los siguientes te quedarías?

        123  1  1  A1  2  22.50
        123  1  2  B1  3  5.60

    ¿Con el que tiene el valor menor o mayor en el campo número? Es decir, ¿con la primera o con la segunda fila? Te podrías quedar con la fila que creas conveniente, pero ¿eso es realmente lo que deseas obtener? ¿Una fila cualquiera sin importar los datos que tienen las demás columnas?

    Aparte, anteriormente te he efectuado otra pregunta, y parece ser que no has hecho ni caso. No obstante, te la vuelvo a repetir: ¿los campos número y clave tienen valores únicos en todas las filas?

    Si la respuesta es afirmativa, deberías de FILTRAR LAS FILAS (no las columnas) por el valor de alguno de esos campos, es decir, algo parecido a rellenar un objeto DataTable como resultado de ejecutar la siguiente consulta SQL de selección:

       cmd.CommandText = "SELECT * FROM [Tabuladores$] " & _
                         "WHERE [número] = '1'"

    Con ésta consulta, solamente recuperarás la siguiente fila:

        123  1  1  A1  2  22.50

    Y si especificas como valor el número 2, obtendrías la segunda fila:

        123  1  2  B1  3  5.60

    Pero si solamente tienes el valor 123 correspondiente al campo clavesis, ¿qué fila deseas recuperar filtrando por ese campo si EXISTEN DOS O MÁS FILAS CON EL MISMO VALOR?

    Creo que te deberías de replantear mejor lo que deseas hacer.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción 

    Hola Enrique gracias por tomarte la molestia de ayudarme y déjame decirte que logre conseguir lo que queria tal vez no fui muy explisito o no me di a entender pero voy a compartirlo por si a alguien le sirve de la manera que lo hago.

    For Each fila As DataRow In datossin.Rows 'creamos un contador Dim cont As Integer 'asignamos a nuestra variable el valor del primer registro del datatable Dim valor As String = fila("cla").ToString() 'iniciamos el recorrido del datagridview para encontrar coincidencias en la columna For i As Integer = 0 To dgvimportacion.Rows.Count - 1

      Dim x As Integer = i + 1 'le asignamos a nuestra variable el valor de la columna a evaluar Dim claveb As String = dgvimportacion.Rows(i).Cells(3).Value.ToString() 'verificamos si coinciden nuestros valores If valor = claveb Then cont = cont + 1 End If ' si encuentra otra coincidencia el contador se incrementa, si se cumple la ondicion ejecuta la sentencia If cont = 2 Then KryptonMessageBox.Show("Existen registros duplicados en la fila " & x & "") 'borrar el datatable Dim dr As DataTable = CType(dgvimportacion.DataSource, DataTable) dr.Rows.Clear() dgvimportacion.DataSource = dr Me.txtarchivo.Clear() Exit For End If Next cont = 0 Next

    esto lo hice por que el datagridview se carga con datos de una hoja de excel si existen duplicados no deja que los cargue hasta que eliminen los duplicados en dicha hoja.

    Tome los datos de un dataview filtrado por la columna cla, para evitar duplicados y asi puede comparar con los datos del datagridview.

    Tratare de mejorar el código, muchas gracias a los que se tomaron las molestias de ayudarme créanme que me sirvió de mucho, así es esto de la programación divertida y engorrosa en ocasiones.

     Se aceptan sugerencias para mejorar el código. Saludos.


    • Marcado como respuesta saulini domingo, 3 de marzo de 2013 20:29
    • Editado saulini domingo, 3 de marzo de 2013 20:31
    domingo, 3 de marzo de 2013 20:29