none
Eliminar fila vacia de un datagridview RRS feed

  • Pregunta

  • Hola amigos como puedo elimimar filas vacias  de un datagridview, les platico mi problema,

    estoy enlazando un archivo de excel a un datagrid pero ese archivo de excel tiene muchas filas vacias, entonces lo que quiero hacer es eliminar las filas que esten vacias para que me quede el datagridview con registros

    les pongo un ejemplo de como se llena el datagridview

    clave  empleado  consumo importes  salario 

    01      juan          12         13           1300

    fila vacia

    02     pablo        14          14           1500

    02     pedro        15          15           1600

    fila vacia

    a si es como mas o menos esta en mi datagridview pero hay muchas filas que estan vacias entonces las quiero eliminar para tener un datagridview de esta formna

     

    clave  empleado  consumo importes  salario 

    01      juan          12         13           1300

    02     pablo        14          14           1500

    02     pedro        15          15           1600

    les adjunto mi codigo que estoy utilizando


            Dim conexion As New OleDbConnection
            Dim comando As New OleDbCommand
            Dim adaptador As New OleDbDataAdapter
            Dim dsexcel As New DataSet
            Dim j As Integer
            Try
                Dim ExcelPath As String = txtexcelPath.Text.ToLower()
                Dim hoja As String
                hoja = Txthoja.Text.Trim
                conexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ExcelPath & "; Extended Properties= Excel 8.0;"
                conexion.Open()
                comando.CommandText = "SELECT * FROM [" & hoja & "$]"
                comando.Connection = conexion
                adaptador.SelectCommand = comando
                conexion.Close()
                adaptador.Fill(dsexcel, "excel")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Exit Sub
            End Try
            Dim conexion2 As New SqlConnection
            Dim cmdguardar As New SqlCommand
            Dim cmdexis As New SqlCommand

            DataGridView1.DataSource = dsexcel.Tables(0)

     

    me podrian ayudar, gracias

     

     

    jueves, 31 de marzo de 2011 19:57

Respuestas

  • "juan11mh" escribió:

    > estoy enlazando un archivo de excel a un datagrid pero ese archivo
    > de excel tiene muchas filas vacias, entonces lo que quiero hacer
    > es eliminar las filas que esten vacias para que me quede el
    > datagridview con registros
    >
    > les adjunto mi codigo que estoy utilizando
    >
    > conexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
    > Data Source=" & ExcelPath & "; Extended Properties= Excel 8.0;"

    Hola:

    Si tu intención es utilizar el ISAM de Excel para eliminar filas en un archivo de Excel, te advierto que estás perdiendo el tiempo, simplemente porque el ISAM de Excel NO PERMITE ELIMINAR FILAS DE UNA HOJA DE CÁLCULO. Es una limitación que tiene dicho ISAM.

    Cuando desees actualizar el archivo de Excel, obtendrás la siguiente excepción:

       Este ISAM no admite la eliminación de datos en una tabla vinculada.

    Como alternativa, puedes crear una nueva hoja de cálculo en el libro que no contenga las filas vacías, y para ello, tampoco es necesario que carges los datos en un control DataGridView.

    Si quieres saber cómo se hace, inserta en tu formulario la siguiente función:

      ''' <author>
      ''' Enrique Martínez Montejo - 2011
      ''' </author>
      ''' <param name="excelPath"></param>
      Private Function CrearNuevaHoja(ByVal excelPath As String, _
                      ByVal nombreHoja As String, _
                      ByVal nombreNuevaHoja As String) As Integer
        Dim connString As String = _
          "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Extended Properties='Excel 8.0;';" & _
          "Data Source=" & excelPath
    
        Try
          ' Configuramos una conexión con el origen de datos.
          '
          Using cnn As OleDbConnection = New OleDbConnection(connString)
    
            ' Creamos y configuramos el comando.
            '
            Dim cmd As OleDbCommand = cnn.CreateCommand
    
            ' Especificamos la consulta SQL de creación de tabla que
            ' vamos a ejecutar. El nombre de la nueva hoja de cálculo,
            ' NO PUEDE ACABAR CON EL SIGNO $.
            '
            cmd.CommandText = String.Format( _
              "SELECT * INTO [{0}] FROM [{1}$] WHERE Campo1 IS NOT NULL", nombreNuevaHoja, nombreHoja)
    
            ' Abrimos la conexión
            cnn.Open()
    
            ' Ejecutamos el comando
            Dim n As Integer = cmd.ExecuteNonQuery()
    
            ' Devolvemos el número de registros afectados
            Return n
    
          End Using
    
        Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador.
          '
          Throw
    
        End Try
    
      End Function
    
    

    Cuando desees crear la nueva hoja de cálculo, simplemente ejecutarías:

           Try
                Dim n As Integer = CrearNuevaHoja("C:\Mis documentos\Libro1.xls", "Hoja1", "NuevaHoja")

                MessageBox.Show(String.Format("Nº de registros afectados: {0}", n))

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

    Fíjate bien en la consulta SQL de creación de tabla:

       SELECT * INTO [{0}] FROM [{1}$] WHERE Campo1 IS NOT NULL

    ¿Observas el valor «Campo1»? Ahí tendrás que especificar el nombre de una columna de la hoja de cálculo para seleccionar aquellas filas que tengan valores válidos (no NULL) en dicha columna. Es decir, la consula SQL seleccionará todas las filas donde el campo especificado tenga un valor.

     

    viernes, 1 de abril de 2011 12:09
    Moderador

Todas las respuestas

  • has un ciclo for que recorra todas las filas y con un if comprueba que esten llenas...

    for each filaas datagridviewrow in datagridview1.rows
       if datagridview1.rows(fila).cell(0).text=nothing then
         datagridview1.rows(fila).remove
       end if
    next
    
    jueves, 31 de marzo de 2011 20:21
  • Yo estaba pensando lo mismo que vos Arthuro pero me surgió la duda si al hacer esto no queda el Dataset distinto respecto del DataGridView.

    Lo menciono porque si necesita operar sobre el DataSet o sobre el DataAdapter no le van a coincidir las filas, o por lo menos así lo veo yo con lo poco que se.

    ¿Seria así o estoy equivocado?


    The Real Blue
    jueves, 31 de marzo de 2011 20:26
  • tienes razon electric_blue, pero este procedimiento lo puedes hacer cada ves que cargues el datagridview y si el caso es manipular la informacion se me hace mas sensillo manipularla desde el mismo grid que desde el dataset, la otra opcion es llenar un datatable con el dataadapter omitiendo las filas que esten vacias, la verdad tengo poca experiencia pero hasta ahora a mi me ha funcionado bien de esta forma

    saludos

    jueves, 31 de marzo de 2011 20:52
  • Buenas a todos.

    Otra forma de ocultar las filas que no contengan datos es modificando la propiedad Visible a False, tomando como ejemplo el de Arthuro:

    for each filaas datagridviewrow in datagridview1.rows
    if filaas.cell(0).text=nothing then
    filaas.Visible = False
    end if
    next

    Un saludo.


    http://www.lopezatienza.es
    jueves, 31 de marzo de 2011 21:02
  • Hola arturo Zerda estoy utilizando tu codigo pero me mandar herrores

    For

    Each filaas DataGridViewRow In DataGridView1.Rows

     

    If DataGridView1.Rows(fila).cell(0).text = Nothing Then

     

    DataGridView1.Rows(fila).remove()

     

    End If
     

     

    Next

    Lo que esta en negritas me manda el error, estoy utilizando Visual Basic: 2008

    jueves, 31 de marzo de 2011 21:24
  • "juan11mh" escribió:

    > estoy enlazando un archivo de excel a un datagrid pero ese archivo
    > de excel tiene muchas filas vacias, entonces lo que quiero hacer
    > es eliminar las filas que esten vacias para que me quede el
    > datagridview con registros
    >
    > les adjunto mi codigo que estoy utilizando
    >
    > conexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
    > Data Source=" & ExcelPath & "; Extended Properties= Excel 8.0;"

    Hola:

    Si tu intención es utilizar el ISAM de Excel para eliminar filas en un archivo de Excel, te advierto que estás perdiendo el tiempo, simplemente porque el ISAM de Excel NO PERMITE ELIMINAR FILAS DE UNA HOJA DE CÁLCULO. Es una limitación que tiene dicho ISAM.

    Cuando desees actualizar el archivo de Excel, obtendrás la siguiente excepción:

       Este ISAM no admite la eliminación de datos en una tabla vinculada.

    Como alternativa, puedes crear una nueva hoja de cálculo en el libro que no contenga las filas vacías, y para ello, tampoco es necesario que carges los datos en un control DataGridView.

    Si quieres saber cómo se hace, inserta en tu formulario la siguiente función:

      ''' <author>
      ''' Enrique Martínez Montejo - 2011
      ''' </author>
      ''' <param name="excelPath"></param>
      Private Function CrearNuevaHoja(ByVal excelPath As String, _
                      ByVal nombreHoja As String, _
                      ByVal nombreNuevaHoja As String) As Integer
        Dim connString As String = _
          "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Extended Properties='Excel 8.0;';" & _
          "Data Source=" & excelPath
    
        Try
          ' Configuramos una conexión con el origen de datos.
          '
          Using cnn As OleDbConnection = New OleDbConnection(connString)
    
            ' Creamos y configuramos el comando.
            '
            Dim cmd As OleDbCommand = cnn.CreateCommand
    
            ' Especificamos la consulta SQL de creación de tabla que
            ' vamos a ejecutar. El nombre de la nueva hoja de cálculo,
            ' NO PUEDE ACABAR CON EL SIGNO $.
            '
            cmd.CommandText = String.Format( _
              "SELECT * INTO [{0}] FROM [{1}$] WHERE Campo1 IS NOT NULL", nombreNuevaHoja, nombreHoja)
    
            ' Abrimos la conexión
            cnn.Open()
    
            ' Ejecutamos el comando
            Dim n As Integer = cmd.ExecuteNonQuery()
    
            ' Devolvemos el número de registros afectados
            Return n
    
          End Using
    
        Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador.
          '
          Throw
    
        End Try
    
      End Function
    
    

    Cuando desees crear la nueva hoja de cálculo, simplemente ejecutarías:

           Try
                Dim n As Integer = CrearNuevaHoja("C:\Mis documentos\Libro1.xls", "Hoja1", "NuevaHoja")

                MessageBox.Show(String.Format("Nº de registros afectados: {0}", n))

            Catch ex As Exception
                MessageBox.Show(ex.Message)

            End Try

    Fíjate bien en la consulta SQL de creación de tabla:

       SELECT * INTO [{0}] FROM [{1}$] WHERE Campo1 IS NOT NULL

    ¿Observas el valor «Campo1»? Ahí tendrás que especificar el nombre de una columna de la hoja de cálculo para seleccionar aquellas filas que tengan valores válidos (no NULL) en dicha columna. Es decir, la consula SQL seleccionará todas las filas donde el campo especificado tenga un valor.

     

    viernes, 1 de abril de 2011 12:09
    Moderador
  • Hola:

    ¿Has probado de usar vistas? Yo las utilizo mucho y casi nunca veo que se utilicen, por aquí

    Dim dv As DataView = New DataView(dsExcel.Tables(0), "Clave > 0")

    DataGridView1.DataSource = dv

    Se supone que la tabla tiene los nombres correctos de campos/columnas, y que Clave es numérico, si no lo es tendras que cambiar la condicion a Clave <> '' (con 2 comillas simples no una comilla doble).

    Saludos

    viernes, 1 de abril de 2011 12:26