Jump to content

Recommended Posts

Posted

O que é que estou a fazer mal?

A ideia é, após clicar no botão "guardar" ou, imediatamente, após terminar a edição da célula (usando o evento CellEndEdit da DataGridView):

1.º - contar o n.º total de colunas numa Datagridview (que tem o nome: dgvExibeDados).

2.º - guardar o conteúdo da DataGridView num ficheiro de texto (ou ainda *.csv),  e, ir adicionando o símbolo ";" a cada uma das células até atingir o n.º máximo de colunas na DataGridView. Quando atingisse o n.º máximo de colunas, iniciaria a linha seguinte a preencher nesse ficheiro de texto.

Supondo que, teríamos um total de 4 colunas exibidas na DataGridView, teríamos conseguido gravar um ficheiro de texto com o seguinte:

1;2;3;4;

5;6;7;8;

9;10;11;12;

Ou seja, o ficheiro guardado, iria conter, o que visualizamos na DataGridView (o conteúdo das colunas e das linhas) mas, em vez de estar separado pelas células, estaria separado pelo símbolo ";".

Estou a fazer da seguinte maneira:

       Dim Texto As New IO.StreamWriter(nomeFicheiro)
        

        For Each col As DataGridViewColumn In dgvExibeDados.Columns

            For Each Linha As DataGridViewRow In dgvExibeDados.Rows

                If Linha.Cells(col.Index).ColumnIndex <> dgvExibeDados.Columns.Count Then
                    Texto.Write(Linha.Cells(col.Index).Value & ";")
                ElseIf Linha.Cells(col.Index).ColumnIndex = dgvExibeDados.Columns.Count Then
                    Texto.Write(Linha.Cells(col.Index).Value & ";" & vbNewLine)
                End If

            Next
        Next


        Texto.Close()
Posted

Desculpa lá mas só tive mais tempo agora.

Introduzi os valores 13,14,15,16 e deveria obter como resultado final:

1;2;3;4;

5;6;7;8;

9;10;11;12;

13;14;15;16;

Mas, infelizmente, eu obtenho o seguinte resultado:

5;9;13;;6;10;14;;7;11;15;;8;12;16;;

Posted

Boas,

tal como o bruno1234 disse tens os for trocados. Primeiro mete o que percorre as linhas e depois o das colunas. Porque como tens ele vai-te percorrer cada linha de cada coluna, em vez de cada coluna de cada linha  🙂

Além disso, tens que ter em atenção que quando usas o dgvExibeDados.Columns.Count, o valor que obtens é 4 (neste caso) ou seja, ao usares para fazer comparações tens que ter cuidado e ver se o outro termo começa com índice 0 ou 1 (penso que normalmente é 0 na maioria dos casos, senão em todos mesmo), neste caso o primeiro valor que o col.Index te dá é 0, logo tens que fazer dgvExibeDados.Columns.Count -1 para teres comparações correctas.

Outro problema que tens aí é o Texto.Write(Linha.Cells(col.Index).Value & ";" & vbNewLine), penso que o vbNewLine não tem qualquer efeito devido a teres utilizado o Texto.Write no entanto não tenho a certeza disto. 👍   Usa antes Texto.WriteLine(Linha.Cells(col.Index).Value & ";") quando for para mudar de linha.

Não sei como estás a preencher a datagrid, mas acho que se for manualmente vais obter sempre uma linha a mais que é a que te aparece no final quando começas a introduzir novos valores.

cumps,

ps: acho que não disse para aqui nenhuma bacorada  ?

Posted

Têm ambos razão... até fiquei triste por eu não ter reparado mais cedo nesses pormenores.

Agora já está a gravar correctamente.

@Soulsick: Vou colocar aqui o código de teste completo para veres como faço para preencher a datagrid.

Pode ser que seja útil a mais alguém.

A propósito... como abro o ficheiro usando um Dataset, será que daria para gravar usando o Dataset?

Imports System.Data.OleDb
Imports System.Text

Public Class Form1


    ' Nome do ficheiro aberto com o controle a que chamei "dlgAbrir" (é uma OpenFileDialog)
    Dim nomeFicheiro As String
    '
    Dim SQL As String
    Dim da As OleDbDataAdapter
    Public Shared ds As DataSet

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        dgvExibeDados.Dock = DockStyle.Fill

    End Sub

    Private Sub AbrirToolStrip_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStrip.Click

        With dlgAbrir
            .Filter = "Ficheiros CSV (*.csv)|*.csv|Ficheiros Texto (*.txt)|*.txt"
            .FileName = ""
        End With

        If dlgAbrir.ShowDialog() = Windows.Forms.DialogResult.OK Then

            nomeFicheiro = dlgAbrir.FileName

            Try
                ' Texto de ligação à base de dados
                '
                ' HDR é igual a Header Describes Row, ou o cabeçalho contém o nome dos campos
                ' FMT é o formato, Delimited significa que um ";" está delimitando os campos
                Dim myConnectionString As String = _
                "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=C:\;" & _
                "Extended Properties='text;" & _
                "HDR=Yes;FMT=Delimited'"

                ' Cria uma nova ligação à base de dados
                Dim connection As New OleDbConnection(myConnectionString)

                ' Abre a ligação à base de dados
                connection.Open()

                ' Cria um novo SqlDataAdapter que servirá para actualizar o DataSet
                SQL = "SELECT * FROM " & CStr(nomeFicheiro)
                da = New OleDbDataAdapter(SQL, connection)

                ' Cria um novo DataSet, ou seja, uma representação em memória da informação
                ds = New DataSet

                ' Coloca a informação da tabela definida no DataSet
                da.Fill(ds, "TESTE") 

                ' Define que a fonte de dados da DataGridView é a nossa DataSet
                ' criando automáticamente as colunas e linhas de dados
                Me.dgvExibeDados.DataSource = ds.Tables("TESTE") 

                ' Para remover a coluna criada a mais na DataGridView
                dgvExibeDados.Columns.RemoveAt(dgvExibeDados.Columns.Count - 1)


                'Fecha a ligação à base de dados
                connection.Close()

            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try

        Else
            Exit Sub
        End If

    End Sub

    
    Private Sub dgvExibeDados_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvExibeDados.CellEndEdit

        Dim Texto As New IO.StreamWriter(nomeFicheiro, False, System.Text.Encoding.Default)

        For Each col As DataGridViewColumn In dgvExibeDados.Columns

            If col.Index <> dgvExibeDados.Columns.Count - 1 Then
                Texto.Write(col.Name & ";")
            ElseIf col.Index = dgvExibeDados.Columns.Count - 1 Then
                Texto.Write(col.Name & ";" & vbNewLine)
            End If

        Next

        For Each Linha As DataGridViewRow In dgvExibeDados.Rows

            For Each col As DataGridViewColumn In dgvExibeDados.Columns

                If Linha.Cells(col.Index).ColumnIndex <> dgvExibeDados.Columns.Count - 1 Then
                    Texto.Write(Linha.Cells(col.Index).Value & ";")
                ElseIf Linha.Cells(col.Index).ColumnIndex = dgvExibeDados.Columns.Count - 1 Then
                    Texto.Write(Linha.Cells(col.Index).Value & ";" & vbNewLine)
                End If

            Next
        Next


        Texto.Close()

    End Sub
End Class
Posted

Em vez de usar DataSet usa uma DataTable visto não estas a usar varias tabelas no mesmo DataSet poupas recursos e ganhas em performance.

There are two ways to write error-free programs; only the third one works.

Posted

Obrigado pelas dicas. Já tinha lido qualquer coisa sobre o xml no blog do jpaulino.

Vou aprofundar melhor sobre as (des)vantagens e como utlizar o xml.

E, claro, testar o xml com o dataTable. Qualquer dúvida abro novo tópico.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.