• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Joca

DataGridView e guardar o conteúdo em texto

10 mensagens neste tópico

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()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim de repente pelo output parece q tás a fazer os for ao contrário.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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. :thumbsup:  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  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se queres fazer trocas entre DataSet e ficheiro podes usar xml.

O DataSet tem um método q escreve o conteudo para xml. O contrário tb é possivel, ficheiro em xml para DataSet.

É a maneira mais directa q conheço.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

Exacto, o DataSet em si é uma estrutura pesada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora