VB.NET - Carregando o conteúdo de uma pasta com LINQ e executando arquivos mp3 em um DataGridview com o MediaPlayer


Neste artigo eu vou mostrar como podemos carregar o conteúdo de uma pasta em um controle DataGridView e executar os arquivos mp3 selecionados usando o MediaPlayer.

O DataGridView  é um o controle que lhe dá a capacidade de personalizar e editar dados tabulares em projetos Windows Forms. Este componente oferece diversas propriedades, métodos e eventos para personalizar sua aparência e comportamento.

A LINQ ou Language integrated Query - é um conjunto de recursos introduzidos no .NET Framework 3.5 que permitem a realização de consultas diretamente em base de dados , documentos XML , estrutura de dados , coleção de objetos ,etc. usando uma sintaxe parecida com a linguagem SQL.

Neste artigo vamos preencher o conteúdo de um DataGridView com o conteúdo de uma pasta , que será informado através da função inputBox, usando uma consulta LINQ, e permitir que o usuário selecione vários arquivos executando-os com o Media Player.

Recursos usados :

Criando o projeto no Visual Studio 2013 Express for windows desktop

Abra o VS 2013 Express for Windows Desktop e clique em New Project;

Selecione a linguagem VB .NET e o template Windows Forms e informe o nome DataGridView_MediaPlayer;

A seguir no formulário form1.vb inclua o seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme o leiaute abaixo:

Vamos agora incluir as referências aos namespaces que iremos usar em nosso projeto:

Imports System.IO

Imports System.ComponentModel

Imports System.Windows.Media

Imports System.Drawing.Color

Para que você consiga declarar a referência ao System.Windows.Media terá que incluir uma referência a biblioteca PresentationCore.

Clique no menu PROJECT e a seguir em Add Reference e selecione o item PresentantionCore e clique em OK;

Agora vamos ao código do projeto...

No evento Click do botão Carregar digite o código abaixo:

 Private Sub btnCarregar_Click(sender As Object, e As EventArgs) Handles btnCarregar.Click
        Dim caminho As String = "F:\musicas\"
        Dim arrLista As New ArrayList
        Dim msg, titulo, valor As String
        Dim objValor As Object
        msg = "Informe o caminho completo dos arquivos. Ex: C:\dados\"
        titulo = "Arquivos mp3" ' define o titulo.
        valor = ""                    ' define o valor padrao
        ' Exibe mensagem posicionada 
        objValor = InputBox(msg, titulo, valor, 700, 400)
        ' se pressionar ESC ou cancelar atribui um valor padrão
        If objValor Is "" Then objValor = caminho
        Try
            obtemArquivos(caminho, arrLista)
            Dim infoArquivos = From file As IO.FileInfo In arrLista Select file.FullName, file.Length
            dgvMusicas.DataSource = infoArquivos.ToList
            formataGridView()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Neste código usamos a função inputbox do Visual Basic para apresentar uma caixa de diálogo solicitando ao usuário o caminho e nome da pasta onde estão os arquivos .mp3.

A seguir chamamos a função obtemArquivos() passando o caminho e um arrayList para armazenar o conteúdo da pasta.

Usando uma consulta LINQ extraímos o nome completo do arquivo e seu tamanho e atribuímos ao datagridview e formatamos o grid.

O código do método obtemArquivos é dado a seguir:

Public Sub obtemArquivos(ByVal diretorioRaiz As String, ByRef arrListaArquivos As ArrayList)
        If My.Computer.FileSystem.GetDirectoryInfo(diretorioRaiz).Name = "System Volume Information" Then
            Return
        End If
        Try
            For Each recursiveDir As String In My.Computer.FileSystem.GetDirectories(diretorioRaiz)
                Call obtemArquivos(recursiveDir, arrListaArquivos)
            Next
            Dim arquivos = From file In My.Computer.FileSystem.GetFiles(diretorioRaiz, FileIO.SearchOption.SearchTopLevelOnly) _
                                 Order By file _
                                 Select My.Computer.FileSystem.GetFileInfo(file)
            arrListaArquivos.AddRange(arquivos.ToList)
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

Este código usa uma consulta LINQ para recursivamente obter os arquivos de uma pasta informada.

O código da rotina formataGridView() é visto a seguir:

 Private Sub formataGridView()
        With dgvMusicas
            .AutoGenerateColumns = False
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
            'altera a cor das linhas alternadas no grid
            .RowsDefaultCellStyle.BackColor = System.Drawing.Color.Aqua
            .AlternatingRowsDefaultCellStyle.BackColor = System.Drawing.Color.Aquamarine
            'altera o nome das colunas
            .Columns(0).HeaderText = "Nome do Arquivo"
            .Columns(1).HeaderText = "Tamanho"
            .Columns(0).Width = 500
            .Columns(1).Width = 100
            'seleciona a linha inteira
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            'permite seleção de multiplas linhas
            .MultiSelect = True
            ' exibe nulos formatados
            .DefaultCellStyle.NullValue = " - "
            'permite que o texto maior que célula não seja truncado
            .DefaultCellStyle.WrapMode = DataGridViewTriState.True
            'define o alinhamento da coluna 1
            .Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        End With
    End Sub

Este código formata o datagridview usando suas propriedades e recursos.

Após selecionar os arquivos o usuário deve clicar no botão Tocar Seleção para executar os arquivos. O código do evento Click deste botão é dado a seguir:

  Private Sub btnTocar_Click(sender As Object, e As EventArgs) Handles btnTocar.Click, btnSair.Click
        Try
            Tm.Interval = 100
            Tm.Start()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Este código define um intervalo do timer e inicia o timer.

O código associado ao evento Tick do timer é dado abaixo:

Private Sub Tm_Tick(sender As Object, e As EventArgs) Handles Tm.Tick
        Static posicao As Integer = 0
        Dim tempo As Integer
        If posicao < dgvMusicas.SelectedRows.Count Then
            Dim tocar As Integer = dgvMusicas.SelectedRows.Count - 1 - posicao
            Dim nomeMusica As String = CStr(dgvMusicas.SelectedRows(tocar).Cells(0).Value())
            tempo = PlayMedia(nomeMusica)
            posicao += 1
            Tm.Interval = tempo
            Tm.Start()
        End If
    End Sub

O código percorre a seleção dos arquivos feitos e chama a rotina PlayMedia()  passando o nome do arquivo .mp3 para execução.

O código da rotina PlayMedia() é dado abaixo:

Private Function PlayMedia(titulo As String) As Integer
        Try
            Dim media_player As New MediaPlayer
            media_player.Open(New System.Uri(titulo))
            System.Threading.Thread.Sleep(3000) 'da tempo para carregar a midia
            Dim duration = media_player.NaturalDuration.TimeSpan
            Dim time As Integer
            time = CInt(duration.TotalMilliseconds)
            media_player.Play()
            Return time
            media_player.Close()
        Catch ex As Exception
            Throw ex
        End Try
    End Function

O código cria uma instância do MediaPlayer e abre o arquivo selecionado para execução.

Executando o projeto e selecionando alguns arquivos iremos obter o seguinte resultado:

Este projeto mostra como usar alguns recursos interessantes da linguagem VB .NET como o MediaPlayer, o DataGridVIew, o inputbox e as consultas LINQ mas esta longe de ser uma aplicação de produção pois dependendo do cenário poderá ocorrer travamentos em sua execução. Além disso a aplicação pode ser melhorada com recursos como parar e continuar a execução do arquivo e outros detalhes.

Pegue o projeto aqui : DataGridView_Tocador.zip

João 6:35 Declarou-lhes Jesus. Eu sou o pão da vida; aquele que vem a mim, de modo algum terá fome, e quem crê em mim jamais terá sede.
João 6:36 Mas como já vos disse, vós me tendes visto, e contudo não credes.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

         Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti