Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Mary en 13 de Septiembre 2014, 22:23
-
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.
-
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
-
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.
-
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
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
-
Hola,
me sigue saliendo error en la misma línea, pero esta vez aparece:
"No sé controló SystemErrorException"
¿Qué quiere decir esto?
Saludos,
-
Para comprobar por partes, ¿si eliminas el código de Private Sub ComboBox1_SelectedIndexChanged te carga bien los datos o tienes algún error?
-
Hola,
cuando elimino el código private sub combobox1, no me sale ningún error.
-
Prueba con esta idea a ver si funciona:
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 ::)
-
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.
-
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
-
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.
-
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)
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
-
No, lo siento. Se queda igual.
¿el problema podría ser que estoy utilizando Excel en vez de una base de datos?
-
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:
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
-
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,
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
-
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!
-
Mi idea es que lo puedan utilizar más personas, así que pasaré los datos del libro Excel a una base de datos.
Saludos,