LER TEXTBOX E RETORNAR RESULTADO EM COLUNAS

ROGERIOAZEVEDO 30/07/2012 14:39:36
#406871
Boa tarde.

Prezados, estou recorrendo a vocês novamente por que na minha limitação não consegui achar a solução para este problema. Estou criando uma aplicação que faz a leitura de uma porta serial que traz dados de uma acesso em uma linha.

Dado lido na serial e escrito em uma Richtextbox:

2012/07/30 12:10 System Area Access denied User Code 8

Preciso que o código leia essa linha e separe as informações que eu preciso em 3 colunas. Eu recebi a ajuda de um colega e fiz o código abaixo que quase solucionou o problema.

Public Sub Limpar(ByVal controlP As Control)
Dim ctl As Control
For Each ctl In controlP.Controls
If TypeOf ctl Is RichTextBox Then
DirectCast(ctl, RichTextBox).Text = String.Empty
ElseIf ctl.Controls.Count > 0 Then
Limpar(ctl)
End If
Next

End Sub

Sub Carregar()

Dim data As String = rtbReceived.Text.Substring(0, 10)
Dim hora As String = rtbReceived.Text.Substring(11, 6)
Dim acesso As String = rtbReceived.Text.Substring(33, 15)
Dim usuario As String = rtbReceived.Text.Substring(58, 15)

Dim lista As List(Of Ponto) = New List(Of Ponto)
Dim item As Ponto = New Ponto
item.Data = Convert.ToDateTime(data)
item.Hora = hora
item.Acesso = acesso
item.Usuario = usuario
lista.Add(item)
tabela.DataSource = lista [ô]Onde dgvDataGrid é o nome do seu objeto grid

[ô]DECLARANDO STRING PARA INSERIR OS DADOS
Dim SQL As String = [Ô]INSERT INTO _Ponto_GSN([data], [hora], [acesso], [usuario]) VALUES (@data, @hora, @acesso, @usuario);[Ô]

[ô]CRIA CONEXÃO COM A BASE DE DADOS
Dim Conn As New SqlConnection([Ô]Server = 187.115.65.188; Database = GSNDATA; integrated security = true[Ô])

Try
Conn.Open()
Catch ex As Exception
MessageBox.Show(ex.Message, [Ô]Falha na conexão SQL[Ô])

End Try
If Conn.State = 1 Then
Me.Text = [Ô]Sistema Conectado ao DB GSNDATA[Ô]
Me.BackColor = Color.CadetBlue()
End If

For Each item In lista

Dim cmd As New SqlCommand(SQL, Conn)
cmd.Parameters.AddWithValue([Ô]@data[Ô], item.Data)
cmd.Parameters.AddWithValue([Ô]@hora[Ô], item.Hora)
cmd.Parameters.AddWithValue([Ô]@acesso[Ô], item.Acesso)
cmd.Parameters.AddWithValue([Ô]@usuario[Ô], item.Usuario)
cmd.ExecuteNonQuery()
Next item

Call Me.Limpar(Me)
End Sub

Como podem ver o código acima lê o RICHTEXTBOX e me retirna os valores em substring nas posições exatas dos caracteres, joga a informação em um GRID, que é escrita na base de dados, depois disso o código limpa a RICHTEXTBOX para aguardar outro evento. O código funcionaria perfeitamente se não fosse um pequeno detalhe, não sei por que raios as vezes o dado que vem da seria não é gravado na primeira linha da ROCHTEXTBOX aí ferra tudo, não sei porque motivo as vezes na leitura salta um linha.

Eu pensei que se existisse uma forma de fazer uma leitura na RICHTEXTBOX e fazer um SPLIT pelo numero de caracteres, pois eu preciso apenas da data, hora e o usuário ou seja:

2012/07/30 o primeiro dado tem 10 caracteres
12:10 o segundo dado tem 05 carracteres
System Area Access denied dados despresíveis
User Code 8 o terceiro dado terá entre 11 e 12 caracteres

Seria possível algo assim? Ou seria mais facil tratar a maldita linha em branco, se houver uma forma de remover essa linha em branco seria uma boa solução também. Abaixo o código em que o dado da serial é escrito na RICHTEXTBOX, talvez achem melhor pegar o dado ali e jogar direto na GRID.


Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
ReceivedText(SerialPort1.ReadExisting()) [ô]Automatically called every time a data is received at the serialPort

End Sub


Private Sub ReceivedText(ByVal [text] As String)
[ô]compares the ID of the creating Thread to the ID of the calling Thread
If Me.rtbReceived.InvokeRequired Then
Dim x As New SetTextCallback(AddressOf ReceivedText)
Me.Invoke(x, New Object() {(text)})
Else
Me.rtbReceived.Text &= [text]

End If
End Sub


Desde já agradeço.
ROGERIOAZEVEDO 31/07/2012 14:50:03
#406945
Consegui achar uma solução com uso de timer.
Tópico encerrado , respostas não são mais permitidas