Ir para o conteúdo

Passar dados de um formulário para outro

Às vezes, é necessário partilhar alguns recursos entre formulários. Por exemplo, vamos criar uma aplicação de gestão de recursos, em que no formulário principal escolhemos uma categoria, e noutro, de acordo com a categoria, é-nos mostrada uma lista de produtos que podemos escolher, para no fim devolver os resultados ao formulário principal.

Importante: É altamente aconselhado que façam download do projecto de exemplo e analisem o código enquanto lêem o tutorial. O ficheiro contém o projecto no formato do Visual C# Express 2008, que pode ser lido sem dificuldade nesta versão, e nas posteriores (após processo de conversão).

Enviar informação para um formulário

Muitos programadores optam por usar variáveis globais para ter a informação acessível em todo o projecto. Esta prática, embora simples e rápida, é desaconselhável, pois essa informação vai ficar guardada numa variável até que o programa termine, ocupando recursos desnecessariamente.

Outra solução também rápida é alterar a acessibilidade dos atributos para public (no caso concreto, dos controlos do formulário) e escrever directamente as informações. Esta prática também é desaconselhada, pois deste modo todo e qualquer formulário da aplicação poderá aceder a esse controlo, e uma chamada por engano, pode trazer consequências indesejáveis no futuro.

Pois claro que existem outros métodos. Um método correcto é passar a informação que queremos ao construtor do formulário, como no exemplo que se segue:

public frmDialogoPesquisa(String categoria)
{
    // inicializacoes (...)

    // guardar a categoria, que passámos como argumento ao construtor
    this.categoria = categoria;
}

Neste caso, utilizando sobrecarga de funções, criámos um novo construtor que aceita um argumento, neste caso a categoria. Para poder passar mais dados, podemos optar por colocar mais parâmetros, simplesmente passar um array (se os dados forem do mesmo tipo), ou criar uma estrutura para passar todos os dados.

Outra possibilidade sem mexer no construtor, seria criar um método public que aceitasse argumentos, tal como no construtor. Neste caso, a estratégia é a mesma. Sem usar funções, também era correcto usar as properties do C#, e especificar em cada uma a informação a passar (vamos ver um exemplo de seguida, mas para obter dados).

Devolver informação do formulário de diálogo para o principal

Feita a escolha pelo utilizador, está na hora de pegar os dados e listá-los no nosso formulário principal. Após escolher os produtos, e confirmar no OK, o formulário é fechado. No entanto, como ainda temos a referência ao mesmo, ainda podemos resgatar os valores.

Neste caso, também podíamos ter usado um método público para devolver os dados, mas para mostrar outra alternativa, vamos usar as propriedades. As propriedades podem ser vistas como os conhecidos métodos de get e set do Java, pois fazem precisamente isso: devolvem e permitem modificar informação. Neste caso, vamos criar uma propriedade "read-only", isto é, que apenas permite obter os dados seleccionados (get), mas não modificá-los.

A propriedade é declarada no formulário de diálogo desta forma:

public String[] DadosEscolhidos { 
    get {
        int totalItens = lstResultados.CheckedItems.Count;
        String[] resultados = new String[totalItens];

        for (int i = 0; i < totalItens; i++)
        {
            resultados[i] = lstResultados.CheckedItems[i].ToString();
        }

        return resultados;
    }
}

No outro lado, no formulário principal, obtemos a informação, lendo o conteúdo da propriedade definida:

if (pesquisa.ShowDialog() == DialogResult.OK)
{
    // Obter os dados de pesquisa, usando a propriedade do formulário
    String[] resultados = pesquisa.DadosEscolhidos;

    lstResultados.Items.Clear();

    foreach (String dado in resultados)
    {
        lstResultados.Items.Add(dado);
    }
}

E desta forma, conseguimos obter os dados do outro formulário, sem grande esforço.

Considerações finais

Como foi possível ver, é simples trocar dados entre formulários. Temos de notar, contudo, que nem sempre o caminho mais fácil é o melhor e convém seguir boas práticas de programação.

No caso do C#, é usado o paradigma por objectos — OOP (Object Oriented Programming) ou em português, POO (Programação Orientada a Objectos) — e é importante ter em atenção as questões da acessibilidade de métodos e atributos. Não é correcto, por exemplo, expor para outras classes métodos que apenas devem ser visíveis dentro dessa classe.

Ao utilizar estes mecanismos, podemos evitar as variáveis globais, que a longo prazo podem revelar-se problemáticas, para projectos de maiores dimensões. Usando os recursos que a linguagem oferece (métodos e propriedades), podemos concretizar a tarefa de forma correcta e eficiente.