Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Erro ao Pesquisar por ID (usando formulário com textbox e botão)

Olá pessoal, estou seguindo os passos do curso de Entity Framework 7 usando Windows Form Application com um formulário de cadastro ao invés de usar o console. Na busca por ID, estou tendo dificuldades de converter o número de ID digitado no textbox de pesquisa para que ao clicar no botão de busca, o Entity me traga o ID e preencha os campos. A solução compila mas dá erro ao realizar a busca. Porém, se eu passo o número diretamente como parâmetro, a busca funciona. No meu formulário FrmCadastro está assim:

        private void tsbBuscar_Click(object sender, EventArgs e)
        {
            //Bomba bombaBuscadaPorID = bombaDAO.BuscaBombaPorId(int.Parse(tsbBuscar.Text));  <- compila mas da erro ao pesquisar. 
            //Bomba bombaBuscadaPorID = bombaDAO.BuscaBombaPorId(Convert.ToInt32(tsbBuscar.Text));  < -compila mas da erro ao pesquisar.
            Bomba bombaBuscadaPorID = bombaDAO.BuscaBombaPorId(1); // <- funciona

            if (bombaBuscadaPorID == null)
            {
                MessageBox.Show("Nenhum registro foi encontrado com o ID informado!");
            }
            else
            {                
                tbBombaID.Text = bombaBuscadaPorID.ID.ToString();
                cbBombaStatus.Text = bombaBuscadaPorID.Status_Bomba.ToString();
                cbBombaFabricante.Text = bombaBuscadaPorID.Fabricante_Bomba.ToString();
                cbBombaModelo.Text = bombaBuscadaPorID.Modelo_Bomba.ToString();
                tbBombaNome.Text = bombaBuscadaPorID.Nome_Bomba.ToString();

                cbBombaTipo.Text = bombaBuscadaPorID.Tipo_Bomba.ToString();
                cbBombaMaterialVoluta.Text = bombaBuscadaPorID.Material_Voluta.ToString();
                cbBombaEstagios.Text = bombaBuscadaPorID.Quantidade_Estagios.ToString();
                tbBombaRotorMaximo.Text = bombaBuscadaPorID.Rotor_Maximo.ToString();
                tbBombaRotorMinimo.Text = bombaBuscadaPorID.Rotor_Minimo.ToString();
                cbBombaMaterialRotor.Text = bombaBuscadaPorID.Material_Rotor.ToString();
                cbBombaNormaFlange.Text = bombaBuscadaPorID.Padrao_Flanges.ToString();
                tbBombaTamanhoFlangeSuccao.Text = bombaBuscadaPorID.Diametro_Flange_Succao.ToString();
                tbBombaTamanhoFlangeRecalque.Text = bombaBuscadaPorID.Diametro_Flange_Recalque.ToString();
            }
        }

Na classe DAO o método buscaPorID está parametrizado para receber um número int assim:

        public Bomba BuscaBombaPorId(int id)
        {
            return this.contexto.Bombas.FirstOrDefault(b => b.ID == id);
        }

No console application roda tudo fácil seguindo as aulas, mas confesso que algumas dificuldades extras aparecem ao tentar fazer com formulários. Gostaria de aproveitar e perguntar a vocês quais cursos aqui no Alura me recomendariam sobre boas práticas de refatoração, organizar o código em camadas (tipo este do entity onde o Renan dá as dicas de criar classes do DAO separadas, etc), estou iniciando em C# com windows forms pois tenho o objetivo de criar uma aplicação neste cenário. Agradeço desde já por qualquer ajuda! Abraços!

7 respostas

Olá Samuel,

qual erro ele acusa quando você tenta pegar do TextBox? Manda a stacktrace para a gente dar uma olhada e ver melhor o que aconteceu.

Sobre as boas práticas de programação, você poderia fazer os cursos de SOLID com C# e também de Design Patterns. E para refatoração eu recomendo o livro Refactoring to Patterns do Joshua Kerievsky, que mostra justamente como fazer refatorações buscando seguir os Design Patterns.

Eu agradeço muito pelas dicas Lucas! Vou pesquisar mais sobre Design Patterns!

Sobre o erro, ocorre o seguinte ao tentar usar o método Parse para pegar o int do textbox: Bomba bombaBuscadaPorID = bombaDAO.BuscaBombaPorId(int.Parse(tsbBuscar.Text));

System.FormatException was unhandled
  HResult=-2146233033
  Message=Input string was not in a correct format.
  Source=mscorlib
  StackTrace:
       at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
       at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
       at System.Int32.Parse(String s)
       at Cadastro_de_Bombas.FrmCadastroBombas.tsbBuscar_Click(Object sender, EventArgs e) in D:\APPS\Cadastro de Bombas\Cadastro de Bombas\FrmCadastroBombas.cs:line 270
       at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
       at System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
       at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
       at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
       at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
       at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
       at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ToolStrip.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at Cadastro_de_Bombas.Program.Main() in D:\APPS\Cadastro de Bombas\Cadastro de Bombas\Program.cs:line 19
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()

Deve ter algum caracter estranho na string que está vindo que ele não consegue formatar. Coloca um MessageBox.Show(tsbBuscar.Text) antes de buscar no banco e veja qual valor ele imprime na tela. Isso deve dar uma ideia do que está acontecendo.

Aqui tem um link também sobre o Convert.ToInt32(String)que mostra melhor em quais cenários ele vai dar esta FormatException.

Ao tentar usar o Convert, o erro muda: Bomba bombaBuscadaPorID = bombaDAO.BuscaBombaPorId(Convert.ToInt32(tsbBuscar.Text));

System.FormatException occurred
  HResult=-2146233033
  Message=Input string was not in a correct format.
  Source=mscorlib
  StackTrace:
       at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
       at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
       at System.Convert.ToInt32(String value)
       at Cadastro_de_Bombas.FrmCadastroBombas.tsbBuscar_Click(Object sender, EventArgs e) in D:\APPS\Cadastro de Bombas\Cadastro de Bombas\FrmCadastroBombas.cs:line 271

Lucas, ainda não encontrei o erro mas a dica que me deu de mandar imprimir o conteúdo do texto do textbox numa messagebox me ajudou muito! A Messagebox está devolvendo "buscar" ao invés de exibir o número digitado... ^^

solução!

Agora eu peguei o problema. O tsbBuscar não é o seu textbox, mas sim o botão. Dá para ver isso pelo nome do método que é tsbBuscar_Click. Você na verdade tem que ver qual o (Name) do textbox para chamar no Convert.

Lucas... cara, me deu até vergonha agora kkkk realmente os nomes do botão e do toolStripTextbox estavam muito parecidos que passou desapercebido. Na verdade ele estava tentando converter o nome label (Text) do botão "Buscar" para Int e não ia rodar nunca. Eis a importância de uma padronização correta de nomes por convenção! Muitíssimo obrigado pela ajuda e paciência! Grande abraço!