Jump to content
AndréCJ

SignalR pegar lista de usuários e adicionar a um listview (VB.net)

Recommended Posts

Olá pessoal,

Sou novato em SignalR e estou com uma grande dúvida,  como faço para pegar a lista de usuários on-line de um servidor SignalR/C# com um cliente em VB.net?

Utilizando javascript consigo pegar a lista normalmente porem não estou conseguindo criar o mesmo código em VB.net.

Alguém poderia me ajudar por favor?

 

Função que disponibiliza a lista no servidor:

 

 public bool SendOnlineContacts()
        {
            try
            {
                OnlineContacts onlineContacts = new OnlineContacts();
                foreach (var item in _chatUsers.OrderByDescending(a => a.Value.data))
                {
                    onlineContacts.messageRecipients.Add(item.Value);
                }
                Clients.All.onGetOnlineContacts(onlineContacts);
                return false;
            }
            catch (Exception)
            { 
                throw new InvalidOperationException("Problem in getting contacts!");
            }
        }

 

-------------------------------------------------------------------------

 

Código em ASP:

<script type="text/javascript">
        var Server;
        $(document).ready(function () {

            Server = $.connection.ChatHub;

            $.connection.hub.start({ transport: 'auto', waitForPageLoad: true }, function () {
                Server.server.connect("0123456", "Deu Certo!!!").fail(function (e){
                });
            });


            Server.client.onGetOnlineContacts = function (chatUsers) {

                ShowTable(chatUsers, Server);
            };

        });

        function ShowTable(chatUsers, Server) {

            console.log(chatUsers.messageRecipients);

            if ($("#ListaUsuariosOnline").length) {

                var html = "<table cellspacing='0' cellpadding='5' align='Center' style='font-size:10px; width=1024px;'>";
                html += "<tr style='font-size:10px;'>";
                html += "<th style='font-size:10px;'>Usuário ID</th><th style='font-size:10px;'>Nome/CPF</th><th style='font-size:10px;'>Filial</th><th style='font-size:10px;'>Página atual</th><th style='font-size:10px;'>Navegador</th><th style='font-size:10px;'>Data/Hora</th><th style='font-size:10px;'>Ações</th>";
                html += "</tr>";

                $.each(chatUsers.messageRecipients, function (index, value) {

                    html += "<tr>";
                    html += "<td>" + $(this)[0].messageRecipientId + "</td><td>" + $(this)[0].messageRecipientName + "</td><td>" + $(this)[0].data + "</td><td><input type='button' value='Enviar Msg' onclick=\"Server.server.enviacomando(prompt('Enviar mensagem à " + $(this)[0].messageRecipientName + "', ''), '" + $(this)[0].messageRecipientId + "', 'msg');\" class='btn cancel'> <input type='button' class='btn cancel' value='Enviar Commando' onclick=\"Server.server.enviacomando(prompt('Enviar comando à " + $(this)[0].messageRecipientName + "', ''), '" + $(this)[0].messageRecipientId + "', 'comando');\"></td>";
                    html += "</tr>";
                });

                html += "</table>";

                var len = $.map(chatUsers.messageRecipients, function (n, i) { return i; }).length;

                $("#ListaUsuariosOnlineTotal").html(len);
                $("#ListaUsuariosOnline").html(html);

            }

        }

    </script>

 

Edited by quintelab
Adicionado BBCode

Share this post


Link to post
Share on other sites

Não, é Windows Form.

O sistema funciona da seguinte forma:

Temos vários clientes que se conectam ao Hub e um desses clientes é o Manager criado em VB.net. O Manager será responsável em exibir as informações sobre os clientes. Uma dessas informações é mostrar na tela uma lista com todos os clientes que estão on-line através de um listbox ou listview

 

Consigo pegar essa lista utilizando uma página ASP/Javascript conforme o código que mostrei. Porem gostaria de ter essa mesma lista no Manager.

 

Em outras palavras : não estou conseguindo transcrever o código da página ASP/Javascript para o Manager/Vb.net que é pegar a lista gerada por esta função abaixo que está em meu Hub.

[Serializable]
    public class MessageRecipient
    {
        public MessageRecipient()
        {
            chatRoomIds = new List<string>();
        }
        public string messageRecipientId { get; set; }
        public string messageRecipientName { get; set; }
        public string connectionId { get; set; }
        public DateTime data { get; set; }
        public List<string> chatRoomIds { get; set; }
    }

    [Serializable]
    public class OnlineContacts
    {
        public List<MessageRecipient> messageRecipients { get; set; }
        public OnlineContacts()
        {
            messageRecipients = new List<MessageRecipient>();
        }
    }

public bool SendOnlineContacts()
        {
            try
            {
                OnlineContacts onlineContacts = new OnlineContacts();
                foreach (var item in _chatUsers.OrderByDescending(a => a.Value.data))
                {
                    onlineContacts.messageRecipients.Add(item.Value);
                }
                Clients.All.onGetOnlineContacts(onlineContacts);
                return false;
            }
            catch (Exception)
            { 
                throw new InvalidOperationException("Problem in getting contacts!");
            }
        }

 

 

 

Share this post


Link to post
Share on other sites

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

  • Similar Content

    • By eduardohaag
      Olá,
      Mais uma vez aqui estou eu com uma duvida que não estou conseguindo resolver.
      Estou desenvolvendo um ERP para a grafica da minha esposa. Nesse sistema existe um modulo que registra o tempo trabalhado.
      Para fazer isso existe um botão no formulário principal, que quando é clicado salva a hora na variável entrada, e quando clicado novamente ele registra no banco de dados o intervalo entre a entrada e saida.
      Até ai tudo ok. Porém as vezes a pessoa sai e esquece de clicar para registrar a saida.
       
      Então gostaria de fazer com que a cada 5 minutos fosse verificado se teve alteração na posição do ponteiro do mouse, porém permitindo que o usuário possa usar o programa.
       
      Procurando na internet descobri que para isso o melhor seria usar uma thread para fazer essa verificação da posição do mouse em segundo plano já que seria executado a cada 5 minutos e dessa forma travaria a execução do form principal.
       
      O problema está que quando ele detecta que mouse ficou parado por mais de 5 minutos e executa o codigo que salvo o intervalo no banco de dados acontece esse erro quando chega na linha "btEntrada.Text = "Registrar Entrada"" : "System.InvalidOperationException: 'Operação entre threads inválida: controle 'ToolStrip1' acessado de um thread que não é aquele no qual foi criado.'
       
      Li que tenho que usar algo como invoke e delegate, mas mesmo estudando não consegui entender como implementar.
      meu codigo é o seguinte:
       
      Imports System.ComponentModel Public Class Principal_content Dim saida As DateTime Dim tempo As TimeSpan Dim entrada As DateTime Dim ponteiro As Point Sub GerPonto() Do Threading.Thread.Sleep(5000) If ponteiro = Cursor.Position Then Call registraponto() End If ponteiro = Cursor.Position Loop End Sub Private Sub btEntrada_Click(sender As Object, e As EventArgs) Handles btEntrada.Click Call registraponto End Sub Sub registraponto() Dim trd = New Threading.Thread(AddressOf GerPonto) If btEntrada.Text = "Registrar Entrada" Then entrada = FormatDateTime(Now) btEntrada.Text = "Registrar Saida" btEntrada.ToolTipText = "Registrar Saida" btEntrada.Image = My.Resources.appointment_new_Ativo btEntrada.ForeColor = Color.Lime trd.Start() Else trd.Abort() saida = Now tempo = saida.Subtract(entrada) sql = "INSERT INTO ponto (Data, Entrada, Saida, Segundos) VALUES (#" & Format(entrada, "MM/dd/yyyy") & "#, #" & Format(entrada, "hh:mm:ss") & "#, #" & Format(saida, "hh:mm:ss") & "#, " & Replace(FormatNumber(tempo.TotalSeconds, 0, TriState.False, TriState.False, TriState.False), ",", ".") & ")" btEntrada.Text = "Registrar Entrada" btEntrada.Text = "Registrar Entrada" btEntrada.Image = My.Resources.appointment_new_desativo btEntrada.ForeColor = Color.Red AcessoDB.ExecutarComando(sql, CommandType.Text, Nothing, AcessoDB.TipoDeComando.ExecuteNonQuey) End If End Sub End Class  
    • By drapn
      Boa tarde pessoal
      Estou com um projeto em Vb.Net que consiste em importar dados de uma planilha de Excel para um Datagridview.
      O projeto esta funcionando tudo ok porem notei que quando vou movendo as barras laterais e inferiores o formulário apresenta grande lentidão para mover as colunas etc...
      Fiz o teste criando um projeto novo com somente 1 Form, 1 Datagrid e 1Botão e os códigos para fazer a importação e quando eu "populo" o datagridview com o conteudo ele apresenta esses legs.
       
      Alguem a ja passou por isso?
      Será que é configuração da máquina? (Não é uma máquina tão fraca)
      O Vb.NET é a versão 2015
       
       
      Os arquivos de Excel variam de 80 Linhas por 5 Colunas á 400 linhas e 5 colunas
       
      O código é esse:
       
      Sub ImportaEstoque()         Dim Local         Local = EndArquivo()         If String.IsNullOrWhiteSpace(Local) Then             MessageBox.Show("Nenhum arquivo foi selecionado.", "Informação.", MessageBoxButtons.OK, MessageBoxIcon.Information)             Return         End If         '------------------------------         Dim caminhoArquivoExcel As String = Local         Dim nomePlanilhaExcel As String = "ESTQ" & "$"         Dim conexaoOleDb As OleDbConnection = Nothing         Dim ds As DataSet         Dim cmd As OleDbDataAdapter         '------------------------------         Try             'conexaoOleDb = New OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & Local & ";Extended Properties=Excel 8.0;")             conexaoOleDb = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & Local & ";Extended Properties='Excel 8.0;HDR=Yes'")             'cmd = New OleDbDataAdapter("Select * from [" & nomePlanilhaExcel & "]", conexaoOleDb)             cmd = New OleDbDataAdapter("Select * from [" & nomePlanilhaExcel & "]  Where UM Like '%" & "PC" & "%'", conexaoOleDb)             cmd.TableMappings.Add("Table", "tabelaExcel")             ds = New DataSet             cmd.Fill(ds)             dgvDados.DataSource = ds.Tables(0)         Catch ex As Exception             MessageBox.Show(ex.ToString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)         Finally             conexaoOleDb.Close()         End Try         sbQtdItens.Text = "Encontrados " & dgvDados.RowCount.ToString & " itens."     End Sub  
       
       
      Pessoal desde já muito obrigado pela força!
    • By eduardohaag
      Olá estou criando um sistema onde preciso calcular a previsão de envio do pedido em dias uteis, para isso estou usando um webservice gratuito que retorna um xml, porém estou tendo o erroSystem.XML.XmlException: 'Dados no nível raiz inválidos. Linha 1, posição 1.'
       
      Meu código é 
      Sub Preenchedata() Dim sql = "SELECT PrazoPadraoProducao FROM Configuracoes" Dim dr As DataTable = AcessoDB.ExecutarComando(sql, CommandType.Text, Nothing, AcessoDB.TipoDeComando.ExecuteDataTable) Dim ds As New DataSet Dim xml As String = "https://elekto.com.br/api/Calendars/br-BC/Add?initialDate=" & Now.Year & "-" & Now.Month & "-" & Now.Day & "&days=" & dr.Rows(0).Item(0) & "&type=work" ds.ReadXml(xml)  
      e o xml retornado é 
       
      <dateTime xmlns="http://schemas.microsoft.com/2003/10/Serialization/">2019-05-03T00:00:00Z</dateTime>  
      Alguém tem alguma ideia de como posso eliminar o erro?
    • By lindomar55
      ola amigos preciso de uma ajudinha, estou montando uma aplicaçao usando vb.net windows forms. nela tenho um botao onde chamo uma url no chrome com o seguinte comando.
      Private Sub Btn_abrir_site_Click(sender As Object, e As EventArgs) Handles Btn_abrir_site.Click
              Dim url As String = “https://www.rico.com.você/dashboard/tesouro-direto/“
              Process.Start(url)
          End Sub
      no google entao eu acesso com meu logim manualmente(prefiro assim). e em realizo uma serie de operaçoes, chega um determinado momento que preciso passar passar os dados que o site me apresenta entao(apos as operaçoes) para o aplicativo. ai é que esta o problema. neste ponto estou boiando.
      no codigo abaixo por exemplo: precisava obter os valores 12,36 e 8806,84 de forma automatica e colocar em textbox.
      vi exemplos na net que mostram com webbrowser porem eu prefiro que seja com o chrome. e nesses exemplos ele abre a pagina e ja obtem os dados. eu preciso trabalhar na pagina muiiiito e so depois baixar os dados programaticamente.
      qualquer ajuda sera bem vinda....
       

    • By igadino
      Boa Tarde pessoal eu peguei esta função no link abaixo parece que e em C# e transformei em vb.net só que esta dando o erro na linha em destaque
      https://github.com/BoletoNet/boletonet/blob/master/src/Boleto.Net.MVC/Models/Exemplos.cs

      Public Sub GeraBoletoCE(ByVal qtde As Integer)
              ' Cria o boleto, e passa os parâmetros usuais
              Dim ce As BoletoBancario
              Dim boletos As New List(Of BoletoBancario)()
              For i As Integer = 0 To qtde - 1
                  ce = New BoletoBancario()
                  ce.CodigoBanco = _codigoBanco
                  Dim vencimento As New DateTime(2007, 9, 10)
                  Dim instr As New Instrucao(1)
                  Dim c As New Cedente("00.000.000/0000-00", "Next Consultoria Ltda.", "0123", "100618", "9")
                  c.Codigo = 112233
                  ' BoletoNet.Boleto b = new BoletoNet.Boleto(vencimento, 20.00m, "14", "0123456789", c);
                  Dim b As New Boleto(vencimento, 2952.95, "14", "0123456789", c)
                  b.NumeroDocumento = "21212114779797" '1b.NossoNumero
                  b.Sacado = New Sacado("000.000.000-00", "Jose Pedro Ongueira de Oliveira")
                  b.Sacado.Endereco.[End] = "Rua Dr. Henrique Portugal, 12"
                  b.Sacado.Endereco.Bairro = "Loteamento Lago Sul"
                  b.Sacado.Endereco.Cidade = "Palmas"
                  b.Sacado.Endereco.CEP = "77062141"
                  b.Sacado.Endereco.UF = "TO"
                  b.Sacado.Endereco.Logradouro = "Rua Dr. Henrique Duarte Lima"
                  b.Sacado.Endereco.Numero = "8980978987"
                  b.Sacado.Endereco.Complemento = "Casa"

                  b.NumeroDocumento = "00001"
                  b.DataProcessamento = DateTime.Now
                  b.DataDocumento = DateTime.Now
                  instr.Descricao = "Não Receber após o vencimento"
                  b.Instrucoes.Add(instr)
                  ce.Boleto = b
                  ce.Boleto.Valida()
                  boletos.Add(ce)
              Next
              GeraLayout(boletos)
          End Sub 
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.