Autor Tema: filtrar en datagridview mediante un combobox Visual Basic y Excel  (Leído 30048 veces)

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Hola,
he estado buscando información de como filtrar en un datagridview mediante un combobox. Pero no consigo encontrar lo que busco. Mi problema es el siguiente:
los datos del datagridview los importo desde un hoja Excel.
en el Form tengo un datagridview con mis datos , un combobox y un BindingSource1.
Mi idea es que según lo que escriba dentro del combobox, se filtre por los datos que hay en la columna 2 del datagridview. He estado buscando que en las propiedades del dataviewgrid, en el datasource debo seleccionar BindigSource1. Pero cuando hago esto me aparece el error:

el índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección. Nombre del parámetro:index

y entonces no se carga el datagridview con los datos de la hoja Excel.

Adjunto mi base de datos por si alguien pudiera darme algún consejo. Gracias.
« Última modificación: 26 de Abril 2015, 13:23 por César Krall »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox
« Respuesta #1 en: 13 de Septiembre 2014, 23:32 »
Hola, ¿lo que has incluido es el código Visual Basic de tu proyecto? ¿Con qué versión de Visual Basic estás trabajando?

Lo digo porque lo llamas "Base de datos" pero en realidad no veo una base de datos, sino el código de un proyecto Visual Basic.

¿En qué línea te marca el error exactamente?

Saludos

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox
« Respuesta #2 en: 14 de Septiembre 2014, 12:14 »
Hola,
el proyecto lo he hecho con Visual Basic 2010 Express.
Lo que intento es que al seleccionar una opción del combobox (Mate/Opaca/Transparente) me filtre los datos en el datagridview y únicamente me aparezcan las filas que contiene la palabra seleccionada en el combobox.
El error me lo marca en la línea
Dim dv as Dataview=dt.Default.view
y el mensaje de error que aparece es "No se controló NullReferenceException",

Tengo una hoja Excel con muchos datos y lo que estoy intentado  es poder conseguir es que desde dos ordenadores distintos conectados en red, se puedan ver los datos de la hoja Excel mediante un programa hecho con Visual Basic. Mi duda es si ¿para hacer esto puedo seguir almacenando mis datos en la hoja Excel, o quizás sería mejor almacenarlos en Acces or SQL? O quizás lo estoy haciendo todo mal?
Saludos y gracias por la ayuda.
Vuelvo a adjuntar los datos. He puesto la hoja Excel que estoy utilizando para hacer las pruebas.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox
« Respuesta #3 en: 14 de Septiembre 2014, 12:47 »
Puede (no es seguro) estar relacionado con que el DataTable dt está declarado pero no inicializado, es decir que al escribir Private dt As DataTable no se esté creando el objeto

Al tratar de usarlo aquí sería cuando te tira el error: Dim dv As DataView = dt.DefaultView

Intenta inicializarlo como hacen en este código de ejemplo

Código: [Seleccionar]
Dim Table1 As DataTable
Table1 = New DataTable("TableName")

Dim column1 As DataColumn = New DataColumn("Column1")
column1.DataType = System.Type.GetType("System.String")

Dim column2 As DataColumn = New DataColumn("Column2")
column2.DataType = System.Type.GetType("System.Int32")
Dim column3 As DataColumn = New DataColumn("Column2")
column3.DataType = System.Type.GetType("System.Int32")

Table1.Columns.Add(column1)
Table1.Columns.Add(column2)
Table1.Columns.Add(column3)


Dim Row1 As DataRow
Row1 = Table1.NewRow()

Row1.Items("Column1") = "Item1"
Row1.Items("Column2") = 44
Row1.Items("Column3") = 99

Table1.Rows.Add(Row1)

' Hacer lo mismo para otras filas

Saludos

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox
« Respuesta #4 en: 14 de Septiembre 2014, 13:10 »
Hola,
me sigue saliendo error en la misma línea, pero esta vez aparece:
"No sé controló SystemErrorException"

¿Qué quiere decir esto?
Saludos,

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #5 en: 14 de Septiembre 2014, 21:05 »
Para comprobar por partes, ¿si eliminas el código de Private Sub ComboBox1_SelectedIndexChanged te carga bien los datos o tienes algún error?


Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #6 en: 15 de Septiembre 2014, 09:40 »
Hola,
cuando elimino el código private sub combobox1,  no me sale ningún error.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #7 en: 15 de Septiembre 2014, 10:21 »
Prueba con esta idea a ver si funciona:

Código: [Seleccionar]
Imports System.Data
Imports System.Data.OleDb
'Imports System.Data.SqlClient



Public Class Form1
    Public dv As DataView
    Private Property stConexion As String
    Private dv As New DataView
   
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0; Data Source= 'C:\Users\Packard Bell\Desktop\Tole2.xlsx';  Extended Properties=""Excel 12.0;Xml;HDR=YES;IMEX=2"";") 'este es el codigo que funciona para office 2007 y 2010
            Dim cnConex As New OleDbConnection(stConexion)
            Dim Cmd As New OleDbCommand("Select * From [Hoja1$]", cnConex)
            Dim Ds As New DataSet
            Dim Da As New OleDbDataAdapter
           
            Dim dt As New DataTable
           

            Dim bs As BindingSource = BindingSource1

            cnConex.Open()
            Cmd.Connection = cnConex
            Da.SelectCommand = Cmd
            Da.Fill(Ds)
            dv.Table = Ds.Tables(0)
            Me.DataGridView1.Columns.Clear()
            Me.DataGridView1.DataSource = dv
            'Me.DataGridView1.Columns(2).HeaderText = "TIPO"
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")


        End Try
    End Sub


    Private dt As DataTable
 

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        dv.RowFilter = String.Format("CLASE Like '%{0}%'", ComboBox1.SelectedValue)
    End Sub

End Class

Como verás en ves de crear un nuevo DataView y tener dos, lo que he hecho es poner un único dataview como atributo de clase (con visibilidad en toda la clase) y después que el filtrado se haga sobre este propio DataView sin tener que crear otro  ::)

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #8 en: 15 de Septiembre 2014, 12:51 »
Hola,
he copiado el código, pero ahora aparece el siguiente mensaje de error:
'Referencia a objeto no establecida como instancia de un objeto'
Aparece el formulario, pero el datagridview, no se carga con los datos de la hoja Excel.


Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #9 en: 15 de Septiembre 2014, 13:25 »
He visto que me equivoqué y dv estaba dos veces, prueba quitando una de ellas  o declarándolo de distintas maneras (con public, private, con dim, etc.):

    Public dv As DataView
    Private Property stConexion As String
    Private dv As New DataView

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #10 en: 15 de Septiembre 2014, 13:49 »
Hola,
he eliminado uno de los dv. Ahora no sale aparece ningún error. Cuando ejecuto el formulario, aparece el dataviewgrid con la tabla Excel y cuando selecciono un valor del combobox, ya no indica ningún error en el código, pero lo que sucede es que no filtra la tabla. Es decir, selecciono los valores del combobox pero la tabla sigue exactamente igual.
¿Podría ser un problema de las propiedades del dataviewgrid? ¿Hay que relacionar el dataviewgried con el bindersource de algún modo? Porque estoy probando a seleccionar en la propiedad DataSource del dataviewgrid, el nombre de Bindersource1, pero así tampoco consigo nada.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #11 en: 15 de Septiembre 2014, 14:17 »
Puede ser que esté filtrando pero no refrescando la vista. ¿Cambia algo si escribes esto? (Añadirle Me.DataGridView1.DataSource = dv para intentar que refresque)

Código: [Seleccionar]
   Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        dv.RowFilter = String.Format("CLASE Like '%{0}%'", ComboBox1.SelectedValue)
       Me.DataGridView1.DataSource = dv
    End Sub

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #12 en: 15 de Septiembre 2014, 14:23 »
No, lo siento. Se queda igual.
¿el problema podría ser que estoy utilizando Excel en vez de una base de datos?

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #13 en: 15 de Septiembre 2014, 14:54 »
No parece que ese sea el problema aunque tampoco estoy seguro, los datos los estás recuperando bien si dices que te los muestra por pantalla, daría igual que los recuperes de una base de datos o de un archivo excel...

Otra alternativa, tratar de usar y filtrar por binding source:

Código: [Seleccionar]
Imports System.Data
Imports System.Data.OleDb
'Imports System.Data.SqlClient

Public Class Form1
    Private Property stConexion As String
    Private dv As New DataView
   
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try
            Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0; Data Source= 'C:\Users\Packard Bell\Desktop\Tole2.xlsx';  Extended Properties=""Excel 12.0;Xml;HDR=YES;IMEX=2"";") 'este es el codigo que funciona para office 2007 y 2010
            Dim cnConex As New OleDbConnection(stConexion)
            Dim Cmd As New OleDbCommand("Select * From [Hoja1$]", cnConex)
            Dim Ds As New DataSet
            Dim Da As New OleDbDataAdapter
           
            Dim dt As New DataTable
            Dim dv As New DataView

            Dim bs As BindingSource

            cnConex.Open()
            Cmd.Connection = cnConex
            Da.SelectCommand = Cmd
            Da.Fill(Ds)
            dv.Table = Ds.Tables(0)
            Me.DataGridView1.Columns.Clear()
           
bs = new BindingSource();
bs.DataSource = dv;
Me.dataGridView.DataSource = bs;
            'Me.DataGridView1.Columns(2).HeaderText = "TIPO"


        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")


        End Try
    End Sub


    Private dt As DataTable
   
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
       
        bs.Filter = "CLASE = ComboBox1.SelectedValue";
    End Sub

End Class

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #14 en: 15 de Septiembre 2014, 15:15 »
Hola Ogramar,
¡ya filtra bien!. He probado el último código que me has enviado pero volvía a salir error en bs.Filter = "CLASE = ComboBox1.SelectedValue". Pero al final lo he dejado igual que antes, sólo que he cambiado el código que hay dentro del
Private sub commadbuton1_selectedIndexChanged. Abajo pongo como ha quedado el código finalmente.

Muchas gracias por todo. A mí sola no me abría salido.
Sólo me gustaría hacerte una pregunta antes de dar el tema por cerrado.
¿Sería mejor tener todos los datos en una base de datos de Access o MySql en vez de en un Libro Excel? Lo digo por si a la hora de programar en vb 2010 sería más fácil.
Saludos,

Código: [Seleccionar]
Imports System.Data
Imports System.Data.OleDb

Public Class Form1

    Private Property stConexion As String

    Dim dv As New DataView
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            Dim stConexion As String = ("Provider=Microsoft.ACE.OLEDB.12.0; Data Source= 'C:\Users\rmontañes\Desktop\Prueba.xlsx';  Extended Properties=""Excel 12.0;Xml;HDR=YES;IMEX=2"";") 'este es el codigo que funciona para office 2007 y 2010
            Dim cnConex As New OleDbConnection(stConexion)
            Dim Cmd As New OleDbCommand("Select * From [Hoja1$]", cnConex)
            Dim Ds As New DataSet
            Dim Da As New OleDbDataAdapter

            Dim dt As New DataTable


            Dim bs As BindingSource = BindingSource1

            cnConex.Open()
            Cmd.Connection = cnConex
            Da.SelectCommand = Cmd
            Da.Fill(Ds)
            dv.Table = Ds.Tables(0)
            Me.DataGridView1.Columns.Clear()
            Me.DataGridView1.DataSource = dv
            Me.DataGridView1.Columns(1).HeaderText = "CLASE"
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")


        End Try
    End Sub


    Private dt As DataTable
    Dim SQL As String
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        Try

            SQL = "CLASE like '%" + ComboBox1.Text.Trim + "%'"

            dv.RowFilter = SQL

            DataGridView1.DataSource = dv

            DataGridView1.Update()

        Catch EX As Exception

            MsgBox(EX.Message, 48)

        End Try
    End Sub
End Class


« Última modificación: 15 de Septiembre 2014, 16:50 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #15 en: 15 de Septiembre 2014, 16:53 »
Pues me alegro que al final hayas podido conseguirlo  :D

Sobre si es mejor tener los datos en una base de datos o en un archivo Excel no hay una respuesta sino que depende de cuáles sean tus objetivos. Por ejemplo, si el archivo excel lo vas a manejar tú sola y lo vas a tener en tu ordenador, puedes trabajar con el archivo excel. En cambio si quisieras que varios usuarios se conecten y hagan cambios en los datos al mismo tiempo posiblemente te será mejor que sea una base de datos quien gestione todo eso.

A la hora de programar la dificultad será similar, la cuestión a plantearte es qué necesidades tienes. Si es un programa para usarlo tú y no va a contener demasiados datos un archivo excel te puede resultar suficiente. Si es un programa para usar mucha gente y que va a contener muchos datos mejor una base de datos.

Saludos!

Mary

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 38
    • Ver Perfil
Re:filtrar en datagridview mediante un combobox Visual Basic
« Respuesta #16 en: 15 de Septiembre 2014, 20:27 »
Mi idea es que lo puedan utilizar más personas, así que pasaré los datos del libro Excel a una base de datos.
Saludos,

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".