none
Exibir resultado de consulta sem Datagrid RRS feed

  • Pergunta

  •  

    Olá, gostaria de saber se existe alguma maneira de exibir as linhas de uma consulta SQL sem ter que utilizar o dataGrid

    O problema é que não gosto da visualização do dataGrid, no momento eu faço assim:

     

    Crio varios elementos na tela:

    E quando realizo uma consulta, eu conto quantos valores existem e executo um comando For e dentro dele é assim:

    For i = 0 To 7
          If i = 0 Then
            ' Ai aki muda os valores da primeira linha
    
          Else if i = 1 Then
            ' Ai aki muda os valores da segunda linha
           ... E por ai vai...
          End if
    Next i
    

    Então, eu gostaria de saber se existe alguma alternativa a isso, pois me obriga a realizar mais uma consulta a cada passagem do For pra pegar dados pra preencher a linha...

    Desde já obrigado!

    sexta-feira, 31 de dezembro de 2010 20:10

Respostas

  • Luan,

    Nesse seu caso você poderia fazer algo mais dinâmico... Por exemplo, se você tiver os seus labels nomeados de alguma forma que você diferencie um do outro somente com um número (label1, label2, label3, etc.), é só utilizar um contador e o método Find da coleção de Controls do seu Form para encontrar o label correspondente a "passada" de um while...

    Veja o exemplo abaixo (note que no código que estou passando eu inclui até a parte de abrir a conexão, criar o comando e tudo mais... para o seu caso, a parte interessante para resolver o seu problema seria depois do ExecuteReader)... Dê uma olhada se você consegue entender a ideia para aplicar no seu cenário:

    Note também que utilizei C# no exemplo, mas, você pode facilmente converter para VB.NET utilizando algum conversor gratuito, como este:

    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    using (SqlConnection connection = new SqlConnection(@"SUA_STRING_DE_CONEXAO"))
    {
     try
     {
      connection.Open();
    
      if (connection.State.Equals(ConnectionState.Open))
      {
       using (SqlCommand comm = connection.CreateCommand())
       {
        comm.CommandText = "SELECT NOMEDOCAMPO FROM NOMEDATABELA";
    
        try
        {
         // A parte que interessa para resolver o seu problema começa aqui:
         int contador = 1;
    
         SqlDataReader dataReader = comm.ExecuteReader();
    
         while (dataReader.Read())
         {
          Control[] controlesEncontrados = this.Controls.Find(string.Format("label{0}", contador++), true);
    
          // Se existe algum label disponível para ser preenchido com o índice atual.
          if (controlesEncontrados.Any())
          {
           Label labelCorrespondente = (controlesEncontrados[0] as Label);
    
           if (labelCorrespondente != null)
            labelCorrespondente.Text = dataReader["NOMEDOCAMPO"].ToString();
          }
         }
        }
        catch (Exception ex)
        {
         MessageBox.Show(string.Format("Erro ao retornar informações do banco de dados.\n{0}", ex.Message), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
       }
      }
     }
     catch (SqlException ex)
     {
      MessageBox.Show(string.Format("Não foi possível abrir a conexão com o banco de dados.\n{0}", ex.Message), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
    }
    
    

    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 4 de janeiro de 2011 11:03
    Moderador

Todas as Respostas

  • Luan,

    Não entendi... Você não gosta da visualização da DataGridView, então, está exibindo os dados em qual tipo de controle?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 3 de janeiro de 2011 17:50
    Moderador
  • Estou exibindo em Label e ImageBox...

    Assim: Eu tenho os labs posicionados:

    <icone>     <label>

    <icone>     <label>

    <icone>     <label>

    <icone>     <label>

    <icone>     <label>

     

    E em cada passagem do For ele vai alterar os dados de cada linha.

    terça-feira, 4 de janeiro de 2011 07:49
  • Luan,

    Nesse seu caso você poderia fazer algo mais dinâmico... Por exemplo, se você tiver os seus labels nomeados de alguma forma que você diferencie um do outro somente com um número (label1, label2, label3, etc.), é só utilizar um contador e o método Find da coleção de Controls do seu Form para encontrar o label correspondente a "passada" de um while...

    Veja o exemplo abaixo (note que no código que estou passando eu inclui até a parte de abrir a conexão, criar o comando e tudo mais... para o seu caso, a parte interessante para resolver o seu problema seria depois do ExecuteReader)... Dê uma olhada se você consegue entender a ideia para aplicar no seu cenário:

    Note também que utilizei C# no exemplo, mas, você pode facilmente converter para VB.NET utilizando algum conversor gratuito, como este:

    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    using (SqlConnection connection = new SqlConnection(@"SUA_STRING_DE_CONEXAO"))
    {
     try
     {
      connection.Open();
    
      if (connection.State.Equals(ConnectionState.Open))
      {
       using (SqlCommand comm = connection.CreateCommand())
       {
        comm.CommandText = "SELECT NOMEDOCAMPO FROM NOMEDATABELA";
    
        try
        {
         // A parte que interessa para resolver o seu problema começa aqui:
         int contador = 1;
    
         SqlDataReader dataReader = comm.ExecuteReader();
    
         while (dataReader.Read())
         {
          Control[] controlesEncontrados = this.Controls.Find(string.Format("label{0}", contador++), true);
    
          // Se existe algum label disponível para ser preenchido com o índice atual.
          if (controlesEncontrados.Any())
          {
           Label labelCorrespondente = (controlesEncontrados[0] as Label);
    
           if (labelCorrespondente != null)
            labelCorrespondente.Text = dataReader["NOMEDOCAMPO"].ToString();
          }
         }
        }
        catch (Exception ex)
        {
         MessageBox.Show(string.Format("Erro ao retornar informações do banco de dados.\n{0}", ex.Message), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
       }
      }
     }
     catch (SqlException ex)
     {
      MessageBox.Show(string.Format("Não foi possível abrir a conexão com o banco de dados.\n{0}", ex.Message), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
    }
    
    

    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 4 de janeiro de 2011 11:03
    Moderador
  • Muitor obrigado André! Me ajudou muito!
    segunda-feira, 17 de janeiro de 2011 18:48