C# e VB .NET- Usando o controle OpenFileDialog


Neste artigo eu vou falar sobre o controle OpenFileDialog que faz parte dos controles de Diálogos existente na caixa de ferramenta da IDE do Visual Studio e das versões Express tanto para a linguagem C# como para a linguagem VB .NET.

A figura abaixo exibe a imagem da ToolBox destacando a aba Dialogs onde se encontram os controles de diálogos, e , dentre eles vemos o OpenFileDialog objeto deste artigo:

O controle OpenFileDialog é usado para localizar e selecionar arquivos em um computador.

Abaixo vemos o controle OpenFileDialog onde observamos características idênticas ao Windows Explorer como a navegação pelos arquivos e sua seleção:

Criando um OpenFileDialog

Podemos criar um controle OpenFileDialog em tempo de projeto arrastando o controle da caixa de ferramentas e soltando no formulário Windows Forms.

Ao concluir esta tarefa veremos o controle ser exibido com o nome padrão na base do formulário, e, se pressionarmos F4 veremos também a janela de propriedades do controle onde podemos definir diversas propriedades para o controle:

Na linguagem C# ao incluir o controle no formulário será incluída de forma automática duas linhas de código no projeto na seção #region Windows Form Designer generated code no interior da rotina private void InitializeComponent() :

this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.openFileDialog1.FileName = "openFileDialog1";

Para criar um controle OpenFileDialog em tempo de execução usando C# basta criar uma instância da classe OpenFileDialog e definir suas propriedades:

OpenFileDialog openFileDialog1 = new OpenFileDialog();
 
O método ShowDialog() é quem exibe a janela do controle para localização e seleção de arquivos:

openFileDialog1.ShowDialog();
 
O código abaixo é suficiente para criar e abrir a janela de diálogo do controle OpenFileDialog():

 OpenFileDialog openFileDialog1 = new OpenFileDialog();
 if (openFileDialog1.ShowDialog() == DialogResult.OK)
 {  }

Definindo as propriedades do controle OpenFileDialog

Depois de incluir o controle no formulário podemos definir as propriedades do controle na janela de propriedades.

Vejamos a seguir as principais propriedades deste controle:(Válidas para C# e VB .NET)

1- InitialDirectory - Representa o diretório a ser exibido quando a janela de diálogo aparecer pela primeira vez.
Ex: openFileDialog1.InitialDirectory = @"C:\";

Se a propriedade RestoreDirectory for definida como True a caixa de diálogo restaura o diretório atual antes de ser fechada.
Ex: openFileDialog1.RestoreDirectory = true;

2- Title - Usada para definir ou atribuir um título a janela de diálogo: Ex: openFileDialog1.Title = "Localizar Arquivos";

3- Default Extension - Representa a extensão padrão do arquivo a ser localizado: Ex: openFileDialog1.DefaultExt = "txt";

4- Filter - Representa o filtro da janela de diálogo que será usado para filtrar o tipo de arquivos a serem
carregados durante a localização. O exemplo abaixo exibe somente arquivos com extensão .txt:
Ex: openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";

5- FilterIndex - Representa o indíce do filtro atualmetne selecionado na janela de diálogo: Ex:openFileDialog1.FilterIndex = 2;

6- ChecFileExists - Indica se a janela de diálogo exibirá um aviso se o usuário especificar um nome de arquivo inexistente;
Ex: openFileDialog1.CheckFileExists = true;

7- CheckPathExists - Indica se a janela de diálogo exibirá um aviso se o usuário especificar um caminho inexistente;
Ex: openFileDialog1.CheckPathExists = true;

8- FileName - Representa o nome do arquivo selecionado na janela de diálogo. Ex: textBox1.Text = openFileDialog1.FileName;

9- MultiSelect - Se esta propriedade for definida como True pode-se selecionar mais de um arquivo e FileNames representará todos
os arquivos selecionados. Neste caso deve-se usar um laço foreach para exibir os arquivos selecionados.
     
this.openFileDialog1.Multiselect = true;
     foreach (String file in openFileDialog1.FileNames)
     {     MessageBox.Show(file);  }

10- ReadyOnlyChecked - Indica se a caixa de verificação estará selecionada: Ex: openFileDialog1.ReadOnlyChecked = true;

11- ShowReadyOnly - Indica se a caiaxa de verificação read-only estará disponível ou não. Ex: openFileDialog1.ReadOnlyChecked = true;

Para concluir vamos criar uma pequena aplicação Windows Forms usando o controle OpenFileDialog que permitirá selecionar mais de um arquivo, no caso arquivos imagens, na janela de diálogo exibindo as imagens selecionadas em um container flowLayoutPanel1.

Abra o Visual C# 2010 Express Edition e crie um novo projeto usando o modelo Windows Forms Application com o nome OpenFIleDialogDemo;

Menu File->New Project -> Windows Forms Application , Name = OpenFileDialogDemo;

No formulário padrão form1.cs inclua a partir da ToolBox os seguintes controles:

Defina o seguinte leiaute no formulário form1.cs:

Vamos definir os namespaces usados no projeto conforme abaixo:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Security;
imports System
imports System.Drawing
imports System.Windows.Forms
imports System.Security
C# VB .NET

A seguir no evento Click do botão de comando - btnSelecionarArquivos - inclua o código abaixo:

    private void btnSelecionarArquivos_Click(object sender, EventArgs e)
      {
            //define as propriedades do controle 
            //OpenFileDialog
            this.ofd1.Multiselect = true;
            this.ofd1.Title = "Selecionar Fotos";
            ofd1.InitialDirectory = @"C:\Users\macoratti\Pictures";
            //filtra para exibir somente arquivos de imagens
            ofd1.Filter = "Images (*.BMP;*.JPG;*.GIF,*.PNG,*.TIFF)|*.BMP;*.JPG;*.GIF;*.PNG;*.TIFF|" + "All files (*.*)|*.*";
            ofd1.CheckFileExists = true;
            ofd1.CheckPathExists = true;
            ofd1.FilterIndex = 2;
            ofd1.RestoreDirectory = true;
            ofd1.ReadOnlyChecked = true;
            ofd1.ShowReadOnly = true;
            
            DialogResult dr = this.ofd1.ShowDialog();

            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                // Le os arquivos selecionados 
                foreach (String arquivo in ofd1.FileNames)
                {
                    txtArquivo.Text += arquivo;
                    // cria um PictureBox
                    try
                    {
                        PictureBox pb = new PictureBox();
                        Image Imagem = Image.FromFile(arquivo);
                        pb.SizeMode = PictureBoxSizeMode.StretchImage;
                        //para exibir as imagens em tamanho natural 
                        //descomente as linhas abaixo e comente as duas seguintes
                        //pb.Height = loadedImage.Height;
                        //pb.Width = loadedImage.Width;
                        pb.Height = 100;
                        pb.Width = 100;
                        //atribui a imagem ao PictureBox - pb
                        pb.Image = Imagem;
                        //inclui a imagem no containter flowLayoutPanel
                        flowLayoutPanel1.Controls.Add(pb);
                    }
                    catch (SecurityException ex)
                    {
                        // O usuário  não possui permissão para ler arquivos
                        MessageBox.Show("Erro de segurança Contate o administrador de segurança da rede.\n\n" +
                                                    "Mensagem : " + ex.Message + "\n\n" +
                                                    "Detalhes (enviar ao suporte):\n\n" + ex.StackTrace);
                    }
                    catch (Exception ex)
                    {
                        // Não pode carregar a imagem (problemas de permissão)
                        MessageBox.Show("Não é possível exibir a imagem : " + arquivo.Substring(file.LastIndexOf('\\'))
                                                   + ". Você pode não ter permissão para ler o arquivo , ou " +
                                                   " ele pode estar corrompido.\n\nErro reportado : " + ex.Message);
                    }
                }
            }
        }//fim e evento botão

O código já esta comentado e por este motivo dispensa explicações.

O mesmo código para a linguagem VB .NET ficaria assim:

Private Sub btnSelecionarArquivos_Click(sender As Object, e As EventArgs)
	'define as propriedades do controle 
	'OpenFileDialog
	Me.ofd1.Multiselect = True
	Me.ofd1.Title = "Selecionar Fotos"
	ofd1.InitialDirectory = "C:\Users\macoratti\Pictures"
	'filtra para exibir somente arquivos de imagens
	ofd1.Filter = "Images (*.BMP;*.JPG;*.GIF,*.PNG,*.TIFF)|*.BMP;*.JPG;*.GIF;*.PNG;*.TIFF|" & "All files (*.*)|*.*"
	ofd1.CheckFileExists = True
	ofd1.CheckPathExists = True
	ofd1.FilterIndex = 2
	ofd1.RestoreDirectory = True
	ofd1.ReadOnlyChecked = True
	ofd1.ShowReadOnly = True

	Dim dr As DialogResult = Me.ofd1.ShowDialog()

	If dr = System.Windows.Forms.DialogResult.OK Then
		' Le os arquivos selecionados 
		For Each arquivo As [String] In ofd1.FileNames
			txtArquivo.Text += arquivo
			' cria um PictureBox
			Try
				Dim pb As New PictureBox()
				Dim Imagem As Image = Image.FromFile(arquivo)
				pb.SizeMode = PictureBoxSizeMode.StretchImage
				'para exibir as imagens em tamanho natural 
				'descomente as linhas abaixo e comente as duas seguintes
				'pb.Height = loadedImage.Height;
				'pb.Width = loadedImage.Width;
				pb.Height = 100
				pb.Width = 100
				'atribui a imagem ao PictureBox - pb
				pb.Image = Imagem
				'inclui a imagem no containter flowLayoutPanel
				flowLayoutPanel1.Controls.Add(pb)
			Catch ex As SecurityException
				' O usuário  não possui permissão para ler arquivos
				MessageBox.Show((("Erro de segurança Contate o administrador de segurança da rede." & 
                                                                vbLf & vbLf & "Mensagem : ") + ex.Message & 
                                                                vbLf & vbLf & "Detalhes (enviar ao suporte):" & vbLf & vbLf) + ex.StackTrace)
			Catch ex As Exception
				' Não pode carregar a imagem (problemas de permissão)
 				MessageBox.Show(("Não é possível exibir a imagem : " & 
                                                                arquivo.Substring(arquivo.LastIndexOf("\"C)) & ". Você pode não ter permissão para ler o arquivo , ou " 
                                                                 & " ele pode estar corrompido." & vbLf & vbLf & "Erro reportado : ") + ex.Message)
			End Try
		Next
	End If
End Sub	

Executando o projeto e clicando no botão - Selecionar Arquivos, teremos a janela de diálogo exibindo somente arquivos do tipo imagem conforme a figura a seguir:

Selecionando alguns arquivos e clique em Abrir teremos a exibição dos nomes selecionados na caixa de texto e as imagens no container do formulário conforme figura abaixo:

Assim destacamos como usar o controle OpenFileDialog que é muito útil e versátil tanto para C# como para VB .NET.

Pegue o projeto completo aqui: versão C# => OpenFileDialogDemoCsharp.zip versão VB .NET => OpenFileDialogDemoVBNET.zip

Eu sei é apenas C# e VB .NET, mas eu gosto...

Referências:

José Carlos Macoratti