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

zephirus

System.Collections.ArrayList para listview

14 mensagens neste tópico

Olá,

Como o próprio nome indica, queria passar um arraylist para uma listview no entanto não estou a conseguir. A arraylist é criada na aplicação servidor:

Public pacote As New ArrayList()

pacote.Add(SQLreader("data1"))
pacote.Add(SQLreader("data2"))
pacote.Add(SQLreader("data3"))

send(toUser, pacote)

Public Function send(ByVal gid As Guid, ByVal msg As System.Collections.ArrayList)
   _wsks.Item(gid).Send(msg)
End Sub

E no cliente recebo a mensagem com o seguinte código:

Dim args() As String = dp.Arguments(1)
If args.Length < 1 Then Exit Select

Args(0) é do tipo arraylist e era o que eu queria passar para a listview. Se calhar isto está confuso mas se alguém puder dar uma ajuda, desde já obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim realmente achei confuso, mas o código deve andar à volta disto:

For each itemdoarray in pacote
listview.items.Add(itemdoarray)
Next

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim realmente achei confuso, mas o código deve andar à volta disto:

For each itemdoarray in pacote
listview.items.Add(itemdoarray)
Next

Não funciona. Dá-me este erro:

System.InvalidCastException: Conversion from type 'ArrayList' to type 'String' is not valid.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mudei o código acima. Onde estava send(toUser, pacote), agora está send(toUser, pacote.Count)

E na função send, a variável msg passou a String. Assim consigo receber os dados sem problemas no lado do cliente.

Apenas quando a variável msg é um arraylist é que não consigo recebê-la e colocar os dados numa lista.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mudei o código acima. Onde estava send(toUser, pacote), agora está send(toUser, pacote.Count)

E na função send, a variável msg passou a String. Assim consigo receber os dados sem problemas no lado do cliente.

Apenas quando a variável msg é um arraylist é que não consigo recebê-la e colocar os dados numa lista.

E já tentaste em vez de ser uma ArrayList ser apenas uma Array?

Penso que assim dá. A não ser que necessites mesmo da arraylist.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para ser mais fácil, o programa que estou a fazer é baseado neste exemplo:

http://www.codeproject.com/KB/IP/winsock_revamped.aspx?fid=908760&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=101

O que estou a usar é o Chatter Client/Chatter Server mas o Winsock Orcas Single Demo é um exemplo mais simples em que é possível enviar mensagens server-client e vice-versa. O que eu pretendo é que o server me envie um array ou um arraylist para eu preencher uma listview na parte do cliente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para ser mais fácil, o programa que estou a fazer é baseado neste exemplo:

http://www.codeproject.com/KB/IP/winsock_revamped.aspx?fid=908760&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=101

O que estou a usar é o Chatter Client/Chatter Server mas o Winsock Orcas Single Demo é um exemplo mais simples em que é possível enviar mensagens server-client e vice-versa. O que eu pretendo é que o server me envie um array ou um arraylist para eu preencher uma listview na parte do cliente.

Boas;

Mas se é assim, não vejo porque fazes a confusão com as ArrayList..

Se estás a trabalhar com client/server.. a manipulação dos dados é supostamente feita através de string.. a não ser que prefiras bytes.. :)

Acho que deves elaborar algo tipo um "own protocol".. ou seja fazes algo do tipo..

---> MEU_NICK MINHA_MENSSAGEM

No lado do servidor fazes o parsing e envias o chat para todos os clientes..

Eu aconselhava te a fazer algo tipo o protocolo do IRC..

http://en.wikipedia.org/wiki/Internet_Relay_Chat

Se procurares encontras vários exemplo para VB.NET..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas;

Mas se é assim, não vejo porque fazes a confusão com as ArrayList..

Se estás a trabalhar com client/server.. a manipulação dos dados é supostamente feita através de string.. a não ser que prefiras bytes.. :)

Acho que deves elaborar algo tipo um "own protocol".. ou seja fazes algo do tipo..

---> MEU_NICK MINHA_MENSSAGEM

No lado do servidor fazes o parsing e envias o chat para todos os clientes..

Eu aconselhava te a fazer algo tipo o protocolo do IRC..

http://en.wikipedia.org/wiki/Internet_Relay_Chat

Se procurares encontras vários exemplo para VB.NET..

Eu sei que os dados é com strings e para algumas coisas é suficiente mas eu no meu server tenho uma base de dados sqlite e quero retornar vários dados para preencher a listview no cliente. Posso passar as strings uma a uma e preencher assim a listview mas penso que dê para enviar o tal array, certo? Não estou é a conseguir acertar com as variáveis...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei que os dados é com strings e para algumas coisas é suficiente mas eu no meu server tenho uma base de dados sqlite e quero retornar vários dados para preencher a listview no cliente. Posso passar as strings uma a uma e preencher assim a listview mas penso que dê para enviar o tal array, certo? Não estou é a conseguir acertar com as variáveis...

Nop.. podes é fazer com a propriedade DataSource de uma DataTable.. ou DataSet

Mas para isso deves utilizar o DataGridView..

O ListView também é possível por a funcionar dessa forma.. mas não é tão simples.. precisas de manipular o objecto em si..

Tens aqui um bom exemplo para MS SQL :)

http://vbtuga.blogspot.com/2008/04/vbnet-utilizando-o-controlo.html

Compr. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nop.. podes é fazer com a propriedade DataSource de uma DataTable.. ou DataSet

Mas para isso deves utilizar o DataGridView..

O ListView também é possível por a funcionar dessa forma.. mas não é tão simples.. precisas de manipular o objecto em si..

Tens aqui um bom exemplo para MS SQL :)

http://vbtuga.blogspot.com/2008/04/vbnet-utilizando-o-controlo.html

Compr. ;)

Mas o DataGridView iria estar no lado do server, correcto? Isso não iria solucionar o meu problema pois teria de passar os dados para o cliente na mesma ou está a falhar-me alguma coisa?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas o DataGridView iria estar no lado do server, correcto? Isso não iria solucionar o meu problema pois teria de passar os dados para o cliente na mesma ou está a falhar-me alguma coisa?

Sim desculpa.. percebi mal..

Mas para passar dados entre cliente e servidor.. tens de utilizar strings..

Muitas aplicação utilizão a linguagem XML para tratamento de dados complexos.. penso que não é o teu caso..

Se tentares especificar .. que dados queres passar em concreto..

Talvez te possa especificar alguns exemplos.. :)

Compr.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim desculpa.. percebi mal..

Mas para passar dados entre cliente e servidor.. tens de utilizar strings..

Muitas aplicação utilizão a linguagem XML para tratamento de dados complexos.. penso que não é o teu caso..

Se tentares especificar .. que dados queres passar em concreto..

Talvez te possa especificar alguns exemplos.. :)

Compr.

Vou tentar explicar o melhor que posso.

A minha aplicação 'SERVER' irá estar instalada na máquina X e tenho também nessa máquina uma base de dados sqlite.

A aplicação "CLIENT" será instalada em computadores na mesma rede que o server.

No client, apenas necessito de enviar strings para pedir informação ao server (se pudesse mandar arrays seria ideal mas não necessário). No server, ao receber a string, faço o seguinte:

1. Faço uma query sql que no meu caso vai retornar N valores (strings) para colocar numa tabela. Eu quero colocar esses valores numa tabela que está no cliente portanto preciso de enviar, não uma string, mas várias.

Um exemplo de uma query que vai ler 2 valores, um que será o item de uma listview e outro que será o subitem:

Dim SQLconnect As New SQLiteConnection()
Dim SQLcommand As SQLiteCommand
SQLconnect.ConnectionString = "Data Source=" & appPath & databaseFile & databasePassword
SQLconnect.Open()
SQLcommand = SQLconnect.CreateCommand
SQLcommand.CommandText = "SELECT UserName, EntryDate FROM EntryExit"
Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader()
While SQLreader.Read()
   Dim lvi As New ListViewItem
   Dim slvi1 As New ListViewItem.ListViewSubItem
   lvi.Text = SQLreader("UserName")
   slvi1.Text = SQLreader("EntryDate")
   lvi.SubItems.Add(slvi1)
End While
SQLconnect.Close()

Os dados que retiro da query acima, podem facilmente ser colocados numa listview que esteja na aplicação servidor. Mas eu não pretendo isso. Pretendo enviar essa informação para o cliente!!!

Espero não ter sido confuso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os dados que retiro da query acima, podem facilmente ser colocados numa listview que esteja na aplicação servidor. Mas eu não pretendo isso. Pretendo enviar essa informação para o cliente!!!

Espero não ter sido confuso...

Sim percebi.. mas pra isso tens mesmo de utilizar strings..

Sempre podes fazes uma string como "delimiters" e envias tudo de uma vez para o client.. quando receberes no cliente so tens de fazer o "Split" e fazer um ciclo e adicionar ao listview..

Tipo isto:

'No Servidor
Dim oSB as New Text.StringBuilder
While SQLreader.Read()
oSB.Append("u=" & SQLreader("UserName") & " d=" & SQLreader("EntryDate") & ";")
End While

'No sockets envias os dados
nome_sockets.Send("$STATUS " & Encondig.ASCII.GetBytes(oSB.ToString)


No Cliente quando receberes:
'Verficas se tem mesma keyword a string
If sData:startWith("$STATUS") Then
' sData = dados quem vem do sockets...
sData = sData.ToLower.Trim.Substring(sData.IndexOf("$STATUS") + "$STATUS".Length + 1)
Dim sLinhas() AS String = sData.Splti(";")

For Each sLinha As String In sLinhas
	Dim sUsr As String = sLinha.Substring(sCommand.IndexOf("u="), sCommand.IndexOf(" ")).Trim
	Dim sDat As String = sLinha.Substring(sCommand.IndexOf("d=")).Trim
	'
	Dim lvi As New ListViewItem
	lvi.Text = sUsr
	lvi.SubItems.Add(sDat)
	nome_listview.Items.Add(lvi)
Next
End if

Penso que terás de fazer algo deste tipo..

Compr.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim percebi.. mas pra isso tens mesmo de utilizar strings..

Sempre podes fazes uma string como "delimiters" e envias tudo de uma vez para o client.. quando receberes no cliente so tens de fazer o "Split" e fazer um ciclo e adicionar ao listview..

Tipo isto:

'No Servidor
Dim oSB as New Text.StringBuilder
While SQLreader.Read()
oSB.Append("u=" & SQLreader("UserName") & " d=" & SQLreader("EntryDate") & ";")
End While

'No sockets envias os dados
nome_sockets.Send("$STATUS " & Encondig.ASCII.GetBytes(oSB.ToString)


No Cliente quando receberes:
'Verficas se tem mesma keyword a string
If sData:startWith("$STATUS") Then
' sData = dados quem vem do sockets...
sData = sData.ToLower.Trim.Substring(sData.IndexOf("$STATUS") + "$STATUS".Length + 1)
Dim sLinhas() AS String = sData.Splti(";")

For Each sLinha As String In sLinhas
	Dim sUsr As String = sLinha.Substring(sCommand.IndexOf("u="), sCommand.IndexOf(" ")).Trim
	Dim sDat As String = sLinha.Substring(sCommand.IndexOf("d=")).Trim
	'
	Dim lvi As New ListViewItem
	lvi.Text = sUsr
	lvi.SubItems.Add(sDat)
	nome_listview.Items.Add(lvi)
Next
End if

Penso que terás de fazer algo deste tipo..

Compr.

Exacto, foi o que pensei em fazer e até já fiz algo do género e funcionou. O teu exemplo está bem melhor. Obrigado. Vou fechar o 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