Aprenda C#

  • Página Inicial
  • Contato!
  • Tudo sobre C# Parte 1!
  • Tudo sobre C# Parte 2!
  • Tudo sobre C# Parte 3!
  • Tudo sobre C# Parte 4!
  • Tudo sobre C# Parte 5!
  • Tudo sobre C# Parte 6!
  • Tudo sobre C# Parte 7!
  • Tudo sobre C# Parte 8!
  • Tudo sobre C# Parte 9!
  • Tudo sobre C# Parte 10!
  • Tudo sobre C# Parte 9

    Checkbox

    Crie um novo projeto Windows Form e coloque 3 checkbox com três linguagens de programação, Java, C++ e C#, e os names deles, coloque também um botão e coloque no evento do click esse código:

    
    private void btnClick_Click(object sender, EventArgs e) {
        string saida = "";
    
        // Ifs independentes
        if(cxJav.Checked) {
            saida += "Java\n";
        }
    
        if(cxCpp.Checked) {
            saida += "C++\n";
        }
    
        if(cxCs.Checked) {
            saida += "C#\n";
        }
    
        MessageBox.Show("Linguagens marcadas:\n\n" + saida, "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
    
        saida = ""; // Limpando a variável
    }
    
    

    Agrupando Radio Buttons

    Para colocar um grupo de radio buttons num formulário de C#, coloque um groupbox ou um panel, e dentro dele coloque os radio buttons.

    Num exemplo, coloque três radio buttons com textos Erro, Aviso e Informação, mude as variáveis deles, nas propriedades coloque o checked true em apenas um deles e coloque também um botão e também mude o texto dele.

    Esse é o código do clique do botão:

    
    private void btnClick_Click(object sender, EventArgs e) {
        if(rdErr.Checked) {
            MessageBox.Show("Exemplo de Notificação de Erro", rdErr.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else if(rdAvi.Checked) {
            MessageBox.Show("Exemplo de Notificação de Aviso", rdAvi.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
        else if(rdInf.Checked) {
            MessageBox.Show("Exemplo de Notificação de Informação", rdInf.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    
    

    Formas Diferentes de Leitura e Impressão

    Podemos usar outras formas de leitura e impressão no console em C#, veja por exemplo esse programa aqui:

    
    int n1, n2, res;
    
    Console.Write("Digite um número: ");
    n1 = int.Parse(Console.ReadLine());
    
    Console.Write("Digite outro número: ");
    n2 = int.Parse(Console.ReadLine());
    
    res = n1 + n2;
    
    Console.Clear();
    
    Console.WriteLine("A soma entre {0} e {1} é igual à {2}.", n1, n2, res);
    
    Console.ReadKey();
    
    

    PS: O ReadKey lê apenas um caractere. E o Clear limpa a tela do console.

    Alterado pra nova forma, ele ficaria assim:

    
    int n1, n2, res;
    
    Console.Write("Digite um número: ");
    int.TryParse(Console.ReadLine(), out n1);
    
    Console.Write("Digite outro número: ");
    int.TryParse(Console.ReadLine(), out n2);
    
    res = n1 + n2;
    
    Console.WriteLine($"A soma entre {n1} e {n2} é igual à {res}.");
    
    Console.ReadKey();
    
    

    Isso facilita muito em determinados casos.

    Abrir Nova Janela a Partir de um Form

    Crie um projeto de Windows Form e nessa janela, coloque um botão com texto Abrir Janela e o nome btnAbrir, se desejar aumente o tamanho dele e da fonte.

    Clique com o botão direito na pasta do projeto e crie um novo WindowsForm com o nome NovaJanela, e nela coloque um label com um texto qualquer.

    A forma mais comum é ir no evento de clique do botão do Form1 e colocar esse código:

    
    private void btnAbrir_Click(object sender, EventArgs e) {
        NovaJanela j2 = new NovaJanela();
        
        j2.Show();
    }
    
    

    Para ocultar a primeira janela ao abrir a segunda, colocariamos esse método no evento:

    
    this.Hide();
    
    

    Só que isso, ao fechar a segunda janela, o programa continua rodando mesmo com ele não visível.

    O mais recomendado é usar um thread para isso. Para isso coloque a diretiva using System.Threading no começo do programa. E altere o código dessa forma:

    
    Thread t1;
    
    public Form1() {
        InitializeComponent();
    }
    
    private void btnAbrir_Click(object sender, EventArgs e) {
        this.Close();
    
        t1 = new Thread(abrirJanela); // Sem parênteses mesmo!
    
        t1.SetApartmentState(ApartmentState.STA);
        t1.Start();
    }
    
    private void abrirJanela(object obj) {
        Application.Run(new NovaJanela());
    }
    
    

    Dessa forma ele abrirá a nova janela fechando de verdade a primeira, fazendo que o programa seja encerrado de verdade.

    Determinar a Tela Inicial da Aplicação com Windows Forms

    Por padrão o primeiro form criado no C# é a tela inicial. Mas podemos mudar esse padrão.

    Vá no Gerenciador de Soluções e clique em Program.cs, e veja essa parte do código:

    
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    
    

    Basta alterar o código de Run assim:

    
    Application.Run(new NovaJanela());
    
    

    Dessa forma podemos configurar a tela da qual o programa inicia, independente de quantas tivermos.

    Estruturas de Dados em C#

    Assim como o List, temos também outros tipos de containers, mas com algumas diferenças entre eles.

    O Stack (pilha) é como um tubo fechado de um lado e aberto de outro, onde o primeiro elemento inserido é o último a sair e vice-versa. Veja um exemplo de uso de Stack:

    
    // Inclua System.Collections.Generic
    Stack<char> vogais = new Stack<char>();
    
    vogais.Push('A');
    vogais.Push('E');
    vogais.Push('I');
    vogais.Push('O');
    vogais.Push('U');
    
    while(vogais.Count > 0) {
        Console.WriteLine($"Elemento do topo: {vogais.Peek()}");
        Console.WriteLine($"Número de elementos: {vogais.Count}");
        vogais.Pop();
    }
    
    

    Esses são os métodos básicos das pilhas:

    Método Funcionalidade
    Push() Adiciona um elemento à pilha
    Pop() Remove um elemento da pilha
    Count Exibe o tamanho da pilha
    Peek() Exibe o último elemento da pilha

    Alguns dos exemplos em que uma pilha pode ser usada é em mecanismos de desfazer/refazer de editores, navegação entre páginas web, etc.

    Já na Queue (fila), os primeiros elementos a entrarem também são os primeiros a saírem, como um túnel, aberto dos dois lados. Veja um exemplo de uso de Queue:

    
    // Inclua System.Collections.Generic
    Queue<char> vogais = new Queue<char>();
    
    vogais.Enqueue('A');
    vogais.Enqueue('E');
    vogais.Enqueue('I');
    vogais.Enqueue('O');
    vogais.Enqueue('U');
    
    while(vogais.Count > 0) {
        Console.WriteLine($"Primeiro elemento: {vogais.Peek()}");
        Console.WriteLine($"Número de elementos: {vogais.Count}");
        vogais.Dequeue();
    }
    
    

    PS: Alguns métodos da Queue são diferentes, são esses:

    Método Funcionalidade
    Enqueue() Adiciona um elemento à fila
    Dequeue() Remove um elemento da fila
    Count Exibe o tamanho da fila
    Peek() Exibe o primeiro elemento da fila

    Alguns dos exemplos em que uma fila pode ser usada é em controle de documentos (para impressão, por exemplo), troca de mensagem entre dispositivos numa rede, etc.

    Já o Dictionary, equivalente ao Map de outras linguagens, recebe dois parâmetros, a chave e o valor, se usa assim:

    
    // Inclua System.Collections.Generic
    Dictionary<int, char> vogais = new Dictionary<int, char>();
    
    vogais.Add(1, 'A');
    vogais.Add(2, 'E');
    vogais.Add(3, 'I');
    vogais.Add(4, 'O');
    vogais.Add(5, 'U');
    
    foreach(KeyValuePair<int, char> v in vogais) {
        Console.WriteLine($"Chave: {v.Key} - Elemento: {v.Value}");
    }
    
    vogais.Clear(); // Isso limpa o Dictionary
    
    

    Como exercício, tente outros tipos de elementos nesses contâiners.

    Argumentos para main, args

    Quando usamos passagem de parâmetros para a função main, podemos chamar um programa através do terminal pelo nome, podendo enviar um valor, que pode ser tratado dentro do programa através de um parâmetro, args, na função main.

    A string[] args é um array de string que armazena os argumentos.

    Veja um exemplo de programa que receberá um parâmetro (rodando pelo terminal):

    
    class Program {
        static void Main(string[] args) {
            int cont = 0;
    
            Console.WriteLine($"Argumentos: {args.Length}");
    
            Console.WriteLine("");
    
            while(cont < args.Length) {
                Console.WriteLine($"Parâmetro Nº{cont + 1}: {args[cont]}");
                cont++;
            }
        }
    }
    
    

    Como exercício, tente passar vários tipos de parâmetro, lembrando que quando um parâmetro só tem espaços, passe eles entre aspas.

    Lendo e Escrevendo Arquivos em C#

    Para esse exemplo, crie um aplicativo Windows form com um campo de texto (textBox), dois botões (um pra escrever e outro pra ler) e uma área de texto (textBox multiline).

    Para escrever em arquivos, podemos fazer dessa forma:

    
    private void btnEscr_Click(object sender, EventArgs e) {
        string texto = txtEntr.Text;
    
        // Adicione System.IO
        try {
            StreamWriter arq = new StreamWriter("arquivo.txt", true, Encoding.UTF8); // O parâmetro true adiciona dados ao arquivo, se for false ele o sobrescreverá.
    
            arq.WriteLine(texto);
    
            MessageBox.Show("O texto foi inserido no arquivo com sucesso!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
    
            arq.Close();
        }
        catch(Exception ex) {
            MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    
    

    Para ler, podemos fazer assim:

    
    private void btnLer_Click(object sender, EventArgs e) {
        string texto;
        string saida = "";
        
        // Adicione System.IO
        try {
            StreamReader arq = new StreamReader("arquivo.txt");
    
            texto = arq.ReadLine();
    
            while(texto != null) {
                saida += texto + Environment.NewLine;
                texto = arq.ReadLine();
            }
    
            txtSaid.Text = saida;
    
            arq.Close();
        }
        catch(Exception ex) {
            MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    
    

    Usando Comandos do CMD em Aplicações.

    Crie um aplicativo Windows form com dois botões (verificar Diretório de Usuários e abrir Bloco de Notas) e um textBox multiline.

    No primeiro botão, colocamos isso:

    
    private void btnDir_Click(object sender, EventArgs e) {
        // Incluir System.Diagnostics
        using(Process inicia = new Process()) {
            inicia.StartInfo.FileName = Environment.GetEnvironmentVariable("comspec");
            inicia.StartInfo.Arguments = "/c dir C:\\Users"; // Não esqueça o /c antes
            inicia.StartInfo.RedirectStandardOutput = true;
            inicia.StartInfo.UseShellExecute = false;
            inicia.StartInfo.CreateNoWindow = true;
    
            inicia.Start();
            inicia.WaitForExit();
    
            string saida = inicia.StandardOutput.ReadToEnd();
    
            txtDir.Text = saida;
        }
    }
    
    

    A estrutura using é pra garantir o uso correto de objetos IDisposable.

    PS: Podemos colocar praticamente qualquer comando do Prompt no lugar do dir.

    Para programas externos, no entanto, podemos fazer de forma mais simples:

    
    private void btnNot_Click(object sender, EventArgs e) {
        // Incluir System.Diagnostics e System.ComponentModel
        try {
            Process.Start("notepad.exe");
        }
        catch(Win32Exception ex) {
            MessageBox.Show($"ERRO: {ex.Message}", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
    
    

    PS: Para colocar caminhos em pastas diferentes ou fora do path, use duas barras invertidas (\\) ao invés de uma (\).

    Isso pode ser usado para navegar entre pastas:

    
    Environment.CurrentDirectory = Environment.GetEnvironmentVariable("userprofile"); // Inclua System.IO
    
    string dirAtual = Directory.GetCurrentDirectory() + "\\Desktop";
    
    MessageBox.Show(dirAtual, "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);