Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
46m 06s
Neste artigo, vamos dar uma olhada mais profunda no desenvolvimento de aplicativos C# seguindo a Lição 13 de Tim Corey de sua série "C# App Start to Finish". Tim nos guia através do processo de construção de um aplicativo Windows Forms funcional, focando em como conectar controles de IU como caixas de combinação, caixas de lista e botões a dados. Esta lição demonstra conceitos-chave como vinculação de dados, gerenciamento de listas, conectividade de banco de dados usando Dapper, e validação e depuração básicas, todas habilidades essenciais para construir aplicativos C# do mundo real.
Tim começa nos lembrando de que a Lição 13 é uma continuação do vídeo anterior, onde a seção "Adicionar Novo Membro" foi conectada. Nesta lição, Tim explica que o objetivo principal é conectar a caixa suspensa (caixa de combinação) e a caixa de lista, e então conectar o objeto pessoa recém-criado para que ele apareça na lista. Tim define claramente o plano: esta lição se concentrará na conexão da IU, movimento de dados e sincronização de listas—aspectos fundamentais para construir um aplicativo desktop C#.
Tim explica que por trás da caixa de combinação e da caixa de lista, haverá uma lista de objetos Person. Este é um exemplo clássico de vinculação de dados no Windows Forms, onde elementos de IU são vinculados a coleções de modelos de dados.
Ele cria duas listas privadas no nível da classe:
availableTeamMembers – as pessoas que podem ser adicionadas à equipe
selectedTeamMembers – as pessoas já adicionadas à equipe
Tim esclarece o comportamento esperado: quando uma pessoa é selecionada da caixa suspensa e adicionada, ela deve passar de availableTeamMembers para selectedTeamMembers. Este é um padrão de operação CRUD padrão no desenvolvimento de aplicativos desktop, onde a IU reflete os dados subjacentes.
Tim aborda uma pergunta comum de design: "Por que não restringir membros da equipe com base no torneio?" Ele explica que o formulário Criar Equipe não está vinculado diretamente a um torneio, e múltiplos torneios podem ocorrer simultaneamente.
Tim usa um exemplo prático: se tanto um torneio de basquete quanto um torneio de pingue-pongue estão ocorrendo, uma pessoa pode participar de ambos. Limitar a caixa suspensa exigiria lógica complexa e poderia introduzir bugs. Em vez disso, Tim opta por uma abordagem mais simples:
Esta abordagem demonstra uma decisão prática de design de software: evite complicações desnecessárias a menos que necessário.
Tim cria um método chamado WireUpLists para conectar as listas aos controles de IU. Este método vincula a lista availableTeamMembers à caixa de combinação e a lista selectedTeamMembers à caixa de lista.
Tim aponta uma melhoria chave: em Windows Forms modernos, você pode vincular listas diretamente a controles sem usar um BindingSource separado. Esta é uma dica útil para desenvolvedores que trabalham com vinculação de dados no Windows Forms.
Tim explica que a caixa de combinação deve exibir um nome legível. A propriedade DisplayMember espera uma propriedade de string do modelo Person. Tim avisa que usar apenas FirstName ou LastName pode causar duplicatas.
Então Tim cria uma propriedade somente leitura chamada FullName:
public string NomeCompleto
{
get
{
return "{FirstName} {LastName}";
}
}
Isso demonstra uma prática importante de IU: sempre certifique-se de que sua IU exiba informações amigáveis ao usuário, não dados de objetos brutos.
Tim cria um método chamado CreateSampleData para testar as listas e a IU. Ele adiciona objetos Person de amostra a ambas as listas e chama WireUpLists no construtor.
Esta é uma técnica útil para construir e testar aplicativos Windows Forms rapidamente antes de se conectar a um banco de dados real.
Tim comenta os dados de amostra e se prepara para carregar dados reais. Ele adiciona um método GetPerson_All à interface IDataConnection. Tim explica sua convenção de nomenclatura:
Criar = inserir
Obter = selecionar
Esta é uma estratégia de nomenclatura padrão para camadas de acesso a dados em aplicativos C#.
Tim implementa a versão SQL de GetPerson_All usando Dapper e um procedimento armazenado:
connection.Query<PersonModel>("spPeople_GetAll").ToList();
Tim intencionalmente usa uma variável de saída em vez de um retorno direto para facilitar a depuração. Isso demonstra como as práticas de depuração podem afetar o design do código.
Tim percebe nomes de strings de conexão repetidos e os muda para uma constante. Ele explica que a repetição é uma má prática e pode causar erros mais tarde.
Este é um princípio importante de engenharia de software: DRY (Don't Repeat Yourself).
Tim cria LoadListData() e preenche availableTeamMembers usando GetPerson_All(). A lista selectedTeamMembers permanece vazia, o que é correto, pois uma nova equipe começa vazia.
Isso demonstra como conectar a IU a fontes de dados reais, seja um banco de dados ou arquivo de texto.
Tim cria o manipulador de eventos do botão Adicionar Membro. A lógica é:
Obter a pessoa selecionada da caixa suspensa
Removê-la da lista disponível
Adicioná-la à lista selecionada
Atualizar a UI
Tim explica que o item selecionado deve ser convertido para PersonModel porque a caixa de combinação armazena objetos como objetos. Isso destaca a importância da conversão de tipo e manipulação de objetos em C#.
Tim descobre que a UI não atualiza após mover itens. Após depurar, ele encontra a solução:
Defina DataSource como nulo
Em seguida, reasignar a lista
Isso força a atualização da caixa de combinação e da caixa de lista. Tim enfatiza que habilidades de depuração são essenciais e muitas vezes necessárias para entender como a vinculação de dados se comporta.
Tim renomeia o botão para Remover Selecionado e cria o manipulador de eventos. Isso reverte a operação de adição:
Remover de selectedTeamMembers
Adicionar de volta para availableTeamMembers
Atualizar UI
Tim descobre um bug: se nenhum item for selecionado, um valor nulo é adicionado. Ele adiciona validação:
if (p != null)
{
// prosseguir
}
Isso demonstra validação básica e prevenção de erros.
Tim enfatiza testar seu aplicativo como um usuário que tenta quebrá-lo. Ele aconselha ter testadores que intencionalmente tentam quebrar o aplicativo, porque usuários reais farão ações inesperadas.
Esta é uma lição chave para construir software confiável.
Tim modifica o botão "Criar Membro" para salvar uma nova pessoa no repositório de dados e imediatamente adicioná-la à lista selecionada. Isso demonstra como implementar operações CRUD em um aplicativo Windows Forms.
Tim percebe que a versão de arquivo de texto de GetPerson_All está faltando. Ele a implementa usando uma linha simples:
return PeopleFile.FullFilePath.LoadFile().ConvertToPersonModels();
Isso mostra que o armazenamento baseado em arquivos pode ser implementado facilmente sem lógica complexa.
Tim executa o aplicativo e confirma que a caixa suspensa agora carrega pessoas do arquivo de texto e do banco de dados. Ele adiciona novas pessoas e as vê aparecer imediatamente, mostrando que o sistema completo funciona corretamente.
Tim conclui afirmando que o próximo vídeo será focado em criar a própria equipe. Isso envolve salvar várias peças de dados no banco de dados ou arquivo de texto, completando o recurso.
A Lição 13 de Tim Corey é um exemplo do mundo real de desenvolvimento de aplicativos C# Windows Forms. Da conexão de controles de IU e vinculação de dados à depuração e validação, Tim ensina habilidades práticas de programação para construir aplicativos de desktop reais. Esta lição é especialmente valiosa para desenvolvedores que desejam aprender vinculação de dados, Dapper, operações CRUD em SQL e programação orientada por IU em C#.
Se você quiser continuar aprendendo, a próxima lição de Tim completará o recurso de criação de equipe e amarrará tudo junto em um aplicativo funcional.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy