Array
(
)

Transferência de dados entre formulários

Elessandro Poças
   - 25 jul 2014

Tenho um formulário de pesquisa de clientes.
Segue abaixo o código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TesteConsulta
{
public partial class frmClienteSelecionar : Form
{
public frmClienteSelecionar()
{
InitializeComponent();
}
private void btnPesquisar_Click(object sender, EventArgs e)
{
using (var ctx = new sigproEntities())
{
ctx.Configuration.LazyLoadingEnabled = false;
var resultado = from c in ctx.cliente //Dessa forma não funciona.
select new
{
c.Cliente_Id,
c.ClienteNome,
c.CpfCnpj,
c.DTCadastro,
c.DtNacimento
};
//var resultado = from c in ctx.cliente //Dessa forma funciona.
// select c;
dgvConsulta.DataSource = resultado.ToList();
}
}
private void btnConsultar_Click(object sender, EventArgs e)
{
cliente clienteSelecionado = (dgvConsulta.SelectedRows[0].DataBoundItem as cliente);
frmMedico frm = new frmMedico(clienteSelecionado);
frm.ShowDialog();
}
}
}
Após a consulta quero passar a linha selecionada para um outro formulário.
Segue código do formulário 2.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TesteConsulta
{
public partial class frmMedico : Form
{
public frmMedico(cliente Cliente)
{
InitializeComponent();
this.Text = "ESTUDO - Consulta Médico";
txtCodigo.Text = Cliente.Cliente_Id.ToString();
txtNome.Text = Cliente.ClienteNome;
txtCRM.Text = Cliente.CpfCnpj;
txtDTCadastro.Text = Cliente.DTCadastro.ToString();
txtDtNascimento.Text = Cliente.DtNacimento.ToString();
}
}
}
Se a consulta é realizada desta forma:
var resultado = from c in ctx.cliente //Dessa forma não funciona.
select new
{
c.Cliente_Id,
c.ClienteNome,
c.CpfCnpj,
c.DTCadastro,
c.DtNacimento
};
Os dados não são transferido para o outro formulário e apresenta o seguinte erro:
Clique na imagem para abrir em uma nova janela
Agora se a consulta é feita desta forma:
var resultado = from c in ctx.cliente
select c;
dgvConsulta.DataSource = resultado.ToList();
O erro não acontece.
O que poderia ser...

Itamar Souza
   - 25 jul 2014

Bom dia

Veja se isso lhe ajuda:

//eviando
Session["nomedasession"] = "conteúdo que vai passar ";
Response.Redirect("nomedoformulário");
//recebendo
string SessionRecebe = (string)(Session["nomedasession"]);

Atenciosamente!

Elessandro Poças
   - 25 jul 2014

Session não seria apenas para ASP.
Pois estou usando windows form desktop.

Joel Rodrigues
   - 25 jul 2014

Adicione um breakpoint nesta linha e verifique se o clienteSelecionado está null.

#Código

frmMedico frm = new frmMedico(clienteSelecionado);

Elessandro Poças
   - 25 jul 2014

Joel,

Está como null.

Elessandro Poças
   - 25 jul 2014

Joel,

frmMedico frm = new frmMedico(clienteSelecionado); Nesta linha está como null.

Só que na linha anterior não está null:
cliente clienteSelecionado = (dgvConsulta.SelectedRows[0].DataBoundItem as cliente);

E agora...

Joel Rodrigues
   - 25 jul 2014

Então você já sabe onde está o erro. Tem que mudar a estratégia pra recuperar esse clienteSelecionado. Acho que é mais seguro você pegar algum campo chave no grid e filtrar a coleção de clientes por ele, obtendo assim o objeto Cliente.

Elessandro Poças
   - 26 jul 2014

Joel,
Obrigado pela sua ajuda, vou descrever abaixo uma forma que encontrei de fazer a passagem de informações de um DataGridView de um formulário de pesquisa para uma tela de cadastro.

Estou usando a linguagem C#, Entity Framework 5.0.0 e MSSQL Server 2012, fiz testes com MySQL 5.6 e também funcionou.

No formulário de pesquisa tenho os seguintes componentes:

01 TextBox com o nome de txtPesquisa;
01 Button com o nome de btnPesquisar;
01 DataGridView com o nome de dgvPesquisa;
01 Button com o nome de btnConsultar;

Segue abaixo código do formulário frmClienteSelecionar
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TesteConsulta
{
public partial class frmClienteSelecionar : Form
{
public frmClienteSelecionar()
{
InitializeComponent();
}

private void btnPesquisar_Click(object sender, EventArgs e) //Aqui faço uma consulta usando Linq e mando o resultado para o DataGridView
{

using (var ctx = new sigproEntities())
{
var resultado = from c in ctx.cliente
where c.Empresa_Id == 1 && c.ClienteNome.Contains(txtPesquisa.Text)
orderby c.ClienteNome
select new
{
c.Cliente_Id,
c.ClienteNome,
c.CpfCnpj
};

dgvConsulta.DataSource = resultado.ToList();
}
}

private void btnConsultar_Click(object sender, EventArgs e) //Evento do click do botão consultar.
{
int indice = dgvConsulta.CurrentRow.Index; //Variável que vai armazenar qual linha do DataGridView foi selecionada.
string temporaria = dgvConsulta[0, indice].Value.ToString(); //Variável que armazena a 1ª coluna do linha selecionada, que no caso da consulta realizada é o campo Cliente_Id.

frmMedico frm = new frmMedico(temporaria); //Chamo o formulário para qual quero passar o a variável.
frm.ShowDialog();
}
}
}

No formulário que vai receber os dados vamos deixa-lo da seguinte forma.
using System;
using System.Linq;
using System.Windows.Forms;

namespace TesteConsulta
{
public partial class frmMedico : Form
{
public frmMedico()
{
InitializeComponent();
}

public frmMedico(string idCliente) //Sobrecarga do método construtor original, mas que irá receber o código do cliente.
{
InitializeComponent();

this.Text = "ESTUDO - Consular Cliente";

using (var ctx = new sigproEntities()) //Crio o contexto
{
int id = Convert.ToInt32(idCliente); //converto o valor da string recebida do formulário de pesquisa para int.
var consulta = from c in ctx.cliente //Faço uma consulta Linq e paço como parâmetro de busca o ID do cliente.
where c.Cliente_Id == id
select new
{
c.Cliente_Id,
c.ClienteNome,
c.CpfCnpj,
c.DTCadastro,
c.DtNacimento
};

foreach (var item in consulta) //Onde paço os itens retornados da consulta para os campos da tela.
{
txtCodigo.Text = item.Cliente_Id.ToString();
txtNome.Text = item.ClienteNome;
txtCRM.Text = item.CpfCnpj;
txtDTCadastro.Text = item.DTCadastro.ToString();
txtDtNascimento.Text = item.DtNacimento.ToString();
}
}
}
}
}

Obrigado a todos pelo apoio. Espero que este simples exemplo possa ajudar a todos da comunidade.

Joel Rodrigues
   - 28 jul 2014

Show de bola. Obrigado por compartilhar conosco a solução encontrada.
Um abraço e bons códigos.