Principales respuestas
Conectar un BindingNavigator a un DataGridView sin enlazar

Pregunta
-
Hola
Sabeis que al añadirlo al form, ya trae el BindingNavigator de fabrica, pero como el DataGridView no está conectado a una base de datos, pues como si no existiera, y yo quiero contar con sus funciones.
El caso es que el DataGridView toma los datos de un archivo de texto estructurado y delimitado.
A través de un TextFieldParser analizo el archivo y paso los datos a un array, (row(0))
información relacionada : http://social.msdn.microsoft.com/Forums/es-ES/vsexes/thread/68ad15f7-bf42-4328-8721-20477c702531
Dim row0 As String() = {nombre, Dirección, telefono, ciudad} ' Add a row for each string array. With Me.DataGridView1.Rows .Add(row0) End With
Evidentemente, en el evento Load del formulario, inicio el Datagridview, declaro las columnas, atributos, etc.
Teniendo en cuenta lo anterior, se puede enlazar el BindingNavigator al DataGridView..?
Gracias de antemano.
Saludos.
Jota69
Respuestas
-
El problema se puede solucionar con el uso del WriteXML , y luego usar el RedXML para leer los datos. Tambien puedes crear y guardar el esquema de la tabla. http://msdn.microsoft.com/es-es/library/system.data.dataset%28VS.80%29.aspx
- Marcado como respuesta Jota69 martes, 19 de enero de 2010 1:11
Todas las respuestas
-
Buscando por ahí, he encontrado información relacionada, así que hecho lo siguiente...
'Declaro dos variables Dim table As DataTable table = MakeNamesTable() 'En el procedimiento del primer post, para añadir filas a la tabla. 'y además evitar valores duplicados, anadi lo de más abajo. 'no obstante ya conseguí determinar la primera columna como "Unique". If n <> valor Then Try Dim row0 As String() = {name, Direccion, telefono, ciudad} table.Rows.Add(row0) Catch ex As Exception DuplicateCounter += 1 Exit Try End Try Dim column As DataColumn For Each column In table.Columns Console.WriteLine(column.ColumnName) Next column End If Me.DataGridView1.DataSource = table valor = n Catch ex As Exception DuplicateCounter += 1 Exit Try End Try Loop Me.RichText_ListLog.AppendText("Duplicate ranges: " & DuplicateCounter & vbCrLf) 'Para crear la tabla. Private Function MakeNamesTable() As DataTable ' Create a new DataTable. Dim table As DataTable = New DataTable("Data") ' Declare variables for DataColumn and DataRow objects. Dim column As DataColumn ' Create new DataColumn, set DataType, ColumnName ' and add to DataTable. column = New DataColumn() column.DataType = System.Type.GetType("System.String") column.ColumnName = "name" column.ReadOnly = False column.Unique = True column.AutoIncrement = False ' Add the Column to the DataColumnCollection. table.Columns.Add(column) ' Create 2ª column. column = New DataColumn() column.DataType = System.Type.GetType("System.String") column.ColumnName = "telefono" column.AutoIncrement = False column.ReadOnly = False column.Unique = False ' Add the column to the table. table.Columns.Add(column) ' Create 3ª column. column = New DataColumn() column.DataType = System.Type.GetType("System.String") column.ColumnName = "direccion" column.AutoIncrement = False column.ReadOnly = False column.Unique = False ' Add the column to the table. table.Columns.Add(column) ' Create 4ª column. column = New DataColumn() column.DataType = System.Type.GetType("System.String") column.ColumnName = "ciudad" column.AutoIncrement = False column.ReadOnly = False column.Unique = False ' Add the column to the table. table.Columns.Add(column) ' Return the new DataTable. Me.customersBindingSource.DataSource = dataSet 'Me.DataGridView1.DataSource = table Me.BindingNavigator1.BindingSource = Me.customersBindingSource Me.DataGridView1.AutoGenerateColumns = True MakeNamesTable = table End Function
Pues el BindingNavigator sigue sin funcionar.
No reconoce los datos que contiene el DataGridView, solo se activa cuando introduces una nueva fila, y empieza a contar a partir de ahí, los demás datos para el no existen.
¿Que hago mal?, alguna idea?
Saludos -
Hola de nuevo, hay novedades. Resulta que en la función : "Private Function MakeNamesTable() As DataTable"
Despues de :
' Return the new DataTable.
puse:
' Instantiate the DataSet variable. dataSet = New DataSet() ' Add the new DataTable to the DataSet. dataSet.Tables.Add(table) dataSet.AcceptChanges() Me.customersBindingSource.DataSource = table Me.BindingNavigator1.BindingSource = Me.customersBindingSource Me.DataGridView1.AutoGenerateColumns = True ' Return the new DataTable. MakeNamesTable = table End Function
Y en el primer bloque de código, donde pone:
Me.DataGridView1.DataSource = table
'Lo cambié por: Me.DataGridView1.DataSource = Me.customersBindingSource
'Proceso el primer archivo de texto y todo bien, el BindingNavigator se activa en cuanto
'termina el proceso,y funciona de maravilla, hasta que quiero procesar el siguiente archivo
'de texto,entonces me dice: Que el campo "Nombre" ya existe en "table".
Nota: No se como salirme del código, lo siento si esto queda patatero.
¿Alguna idea, de por donde van los tiros? :)
-
Solucionado el problema:
If Not table.Columns.Count > 0 Then
Y luego añadí a la función MakeNames:
table = MakeNamesTable()
End If
' Instantiate the DataSet variable. dataSet = New DataSet() ' Add the new DataTable to the DataSet. dataSet.Tables.Add(table) dataSet.AcceptChanges() ' Create variable for temporary DataSet. Dim changesDataSet As DataSet ' Add RowChanged event handler for the table. AddHandler table.RowChanged, AddressOf Row_Changed Me.customersBindingSource.DataSource = table Me.BindingNavigator1.BindingSource = Me.customersBindingSource Me.DataGridView1.AutoGenerateColumns = True 'If the table has changes or errors, create a subset DataSet. If dataSet.HasChanges(DataRowState.Modified Or DataRowState.Added) _ And dataSet.HasErrors Then ' Use GetChanges to extract subset. changesDataSet = dataSet.GetChanges( _ DataRowState.Modified Or DataRowState.Added) 'PrintValues(changesDataSet, "Subset values") ' Insert code to reconcile errors. In this case, reject changes. Dim changesTable As DataTable For Each changesTable In changesDataSet.Tables If changesTable.HasErrors Then Dim changesRow As DataRow For Each changesRow In changesTable.Rows 'Console.WriteLine(changesRow["Item"]); If CInt(changesRow("Item", _ DataRowVersion.Current)) > 100 Then changesRow.RejectChanges() changesRow.ClearErrors() End If Next changesRow End If Next changesTable ' Merge changes back to first DataSet. dataSet.Merge(changesDataSet, False, _ System.Data.MissingSchemaAction.Add) End If ' Return the new DataTable. MakeNamesTable = table
Pero no me guarda los datos. Cuando proceso el primer archivo de texto todo bien, pero al procesar el siguiente, este último, me lo coloca en lugar del anterior, en el dataGridView.
¿Como puedo hacer que los datos sean permanentes?, y que al acabar, tenga en un solo archivo, que contenga todos los demás, debidamente filtrados, estructurados, y delimitados?
Lo digo, por que la idea final, es luego exportar todos los datos ya procesados, del DataGridView a un archivo de texto plano, y hasta me planteo un XLM. Pero primero necesito que me guarde los datos.
Se me acaban las ideas... :)
-
El problema se puede solucionar con el uso del WriteXML , y luego usar el RedXML para leer los datos. Tambien puedes crear y guardar el esquema de la tabla. http://msdn.microsoft.com/es-es/library/system.data.dataset%28VS.80%29.aspx
- Marcado como respuesta Jota69 martes, 19 de enero de 2010 1:11