Joca Posted May 3, 2009 at 06:59 PM Report #261031 Posted May 3, 2009 at 06:59 PM 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()
bruno1234 Posted May 3, 2009 at 07:01 PM Report #261032 Posted May 3, 2009 at 07:01 PM Qual é o resultado q obtens com esse codigo? Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
Joca Posted May 6, 2009 at 09:59 PM Author Report #261996 Posted May 6, 2009 at 09:59 PM 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;;
bruno1234 Posted May 6, 2009 at 10:01 PM Report #261997 Posted May 6, 2009 at 10:01 PM Assim de repente pelo output parece q tás a fazer os for ao contrário. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
Soulsick Posted May 7, 2009 at 01:12 AM Report #262024 Posted May 7, 2009 at 01:12 AM 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 ?
Joca Posted May 7, 2009 at 10:17 PM Author Report #262246 Posted May 7, 2009 at 10:17 PM 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
bruno1234 Posted May 7, 2009 at 10:21 PM Report #262249 Posted May 7, 2009 at 10:21 PM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
Hellblazer Posted May 9, 2009 at 04:33 PM Report #262653 Posted May 9, 2009 at 04:33 PM 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.
bruno1234 Posted May 9, 2009 at 06:21 PM Report #262693 Posted May 9, 2009 at 06:21 PM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
Joca Posted May 10, 2009 at 09:37 AM Author Report #262787 Posted May 10, 2009 at 09:37 AM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now