none
Conectar un BindingNavigator a un DataGridView sin enlazar RRS feed

  • 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
    viernes, 8 de enero de 2010 22:32

Respuestas

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
    domingo, 10 de enero de 2010 8:32
  • 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? :)

    domingo, 10 de enero de 2010 10:45
  • Solucionado el problema:

    If Not table.Columns.Count > 0 Then
    table = MakeNamesTable()
    End If
    Y luego añadí a la función MakeNames:

    ' 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... :)

    domingo, 10 de enero de 2010 12:18
  • 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
    martes, 19 de enero de 2010 1:11