Usuário com melhor resposta
Passar valor de TextBox no form2 para DataGridView no form1

Pergunta
-
Boa tarde a todos
Estou com um problema que não consigo resolver, ja tentei de todas as formas que eu conheço e nada, é o seguinte:
tenho 2 forms, o form1 tem um DataGridView, quando clico duas vezes numa linha abre o form2 como ShowDialog e mostra os dados da linha da grid em TextBoxs, no form2 a um botão q pega as informações dos TextBoxs e envia para a mesma linha na grid do form1 e é justamente isso q esta dando erro, quando tento passar as informações do TextBoxs para a mesma linha na grid do form1
quem ja passou por isso ou tiver algum conhecimento de como fazer peço ajuda
obrigado.
Respostas
-
Blz Cara
Então depois de quebrar muito a cabeça consegui resolver, é o seguinte:
No form1 a pessoa digita o CPF ou CNPJ de um cliente e clica no btnPesquisar, caso exista este documento digitado me retornara um DataSet com uma tabela grande, tenho q dar pouco custo para o servidor então resolvi usar Linq em cima do DataSet para não ter q ir novamente até a base, mesmo pq os dados q estam no DataSet é o necessario, então resolvi fazer o seguinte:
form1
o btnPesquisar tem um evento click e dentro dele tem o código:
GridDadosContrato.Rows.Clear();
GridAdendo.Rows.Clear();
Contratos.DAL.
EditContratados editCont = new Contratos.DAL.EditContratados();
DataSet ds = new DataSet();
ds = editCont.BuscarContratado(txtCPF_CNPJ_Edit.Text);
txtNome.Text = ds.Tables[0].Rows[0][1].ToString();
txtCEP.Text = ds.Tables[0].Rows[0][2].ToString();
txtEndereco.Text = ds.Tables[0].Rows[0][3].ToString();
txtBairro.Text = ds.Tables[0].Rows[0][4].ToString();
txtComplemento.Text = ds.Tables[0].Rows[0][5].ToString();
txtCidade.Text = ds.Tables[0].Rows[0][6].ToString();
txtUF.Text = ds.Tables[0].Rows[0][7].ToString();
txtDDD.Text = ds.Tables[0].Rows[0][8].ToString();
txtTelefone.Text = ds.Tables[0].Rows[0][9].ToString();
txtFax.Text = ds.Tables[0].Rows[0][10].ToString();
txtResponsavel.Text = ds.Tables[0].Rows[0][11].ToString();
txtDocs.Text = ds.Tables[0].Rows[0][12].ToString();
var query =
from c in ds.Tables[0].AsEnumerable()
select new
{
ID = c.Field<
int>(13),
Caminho = c.Field<
string>(15),
Valor = c.Field<
decimal>(16).ToString("0.##"),
Data_Contrato = c.Field<
DateTime>(14),
Vigencia = c.Field<
DateTime>(17),
Situacao = c.Field<
bool>(18),
Obs = c.Field<
string>(19)
};
for (int i = 0; i < query.Count(); i++)
{
GridDadosContrato.Rows.Add(
new DataGridViewRow());
GridDadosContrato.Rows[i].Cells[
"ID"].Value = query.ElementAt(i).ID;
GridDadosContrato.Rows[i].Cells[
"Caminho"].Value = query.ElementAt(i).Caminho;
GridDadosContrato.Rows[i].Cells[
"Valor"].Value = query.ElementAt(i).Valor;
GridDadosContrato.Rows[i].Cells[
"DataContrato"].Value = query.ElementAt(i).Data_Contrato.ToShortDateString();
GridDadosContrato.Rows[i].Cells[
"Vigencia"].Value = query.ElementAt(i).Vigencia.ToShortDateString();
GridDadosContrato.Rows[i].Cells[
"Situacao"].Value = query.ElementAt(i).Situacao;
GridDadosContrato.Rows[i].Cells[
"OBS"].Value = query.ElementAt(i).Obs;
}
var queryAdendo =
from c in ds.Tables[0].AsEnumerable()
where !c.IsNull("IDAdendo")
select new
{
ID = c.Field<
int>(20),
ID_Contrato = c.Field<
int>(21),
Caminho = c.Field<
string>(22),
Obs = c.Field<
string>(23)
};
for (int i = 0; i < queryAdendo.Count(); i++)
{
GridAdendo.Rows.Add(
new DataGridViewRow());
GridAdendo.Rows[i].Cells[
"ID_Adendo"].Value = queryAdendo.ElementAt(i).ID;
GridAdendo.Rows[i].Cells[
"ID_Contrato"].Value = queryAdendo.ElementAt(i).ID_Contrato;
GridAdendo.Rows[i].Cells[
"Caminho_Adendo"].Value = queryAdendo.ElementAt(i).Caminho;
GridAdendo.Rows[i].Cells[
"OBS_Adendo"].Value = queryAdendo.ElementAt(i).Obs;
}
Para eu editar algum dado numa das grids, preciso clicar 2 vezes e então abrirá um form no estilo ShowDialog com os campos da grid, quando termino de editar clico no botão salvar e pronto salvo os dados editados no grid, quando não tiver mais nada para editar clico no btnSalvarDados e as informações vão para a base para atualizar.
código da GridDadosContrato evento CellDoubleClick
frmEditContrato
contrato = new frmEditContrato();
contrato.ID = (
int)GridDadosContrato.Rows[e.RowIndex].Cells[0].Value;
contrato.Caminho = GridDadosContrato.Rows[e.RowIndex].Cells[1].Value.ToString();
contrato.Valor =
decimal.Parse(GridDadosContrato.Rows[e.RowIndex].Cells[2].Value.ToString());
contrato.DataContrato =
Convert.ToDateTime(GridDadosContrato.Rows[e.RowIndex].Cells[3].Value);
contrato.Vigencia =
Convert.ToDateTime(GridDadosContrato.Rows[e.RowIndex].Cells[4].Value);
contrato.Situacao =
Convert.ToBoolean(GridDadosContrato.Rows[e.RowIndex].Cells[5].Value);
contrato.Obs = GridDadosContrato.Rows[e.RowIndex].Cells[6].Value.ToString();
contrato.index = e.RowIndex;
if (contrato.ShowDialog(this) == DialogResult.OK)
{
GridDadosContrato.Rows[contrato.index].Cells[1].Value = contrato.Caminho;
GridDadosContrato.Rows[contrato.index].Cells[2].Value = contrato.Valor;
GridDadosContrato.Rows[contrato.index].Cells[3].Value = contrato.DataContrato.ToShortDateString();
GridDadosContrato.Rows[contrato.index].Cells[4].Value = contrato.Vigencia.ToShortDateString();
GridDadosContrato.Rows[contrato.index].Cells[5].Value = contrato.Situacao;
GridDadosContrato.Rows[contrato.index].Cells[6].Value = contrato.Obs;
}
código da GridAdendo evento CellDoubleClic
private
void GridAdendo_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
frmEditAdendo adendo = new frmEditAdendo();
adendo.IDAdendo = (
int)GridAdendo.Rows[e.RowIndex].Cells[0].Value;
adendo.IDContrato = (
int)GridAdendo.Rows[e.RowIndex].Cells[1].Value;
adendo.Caminho = GridAdendo.Rows[e.RowIndex].Cells[2].Value.ToString();
adendo.Obs = GridAdendo.Rows[e.RowIndex].Cells[3].Value.ToString();
adendo.IndexAdendo = e.RowIndex;
if (adendo.ShowDialog(this) == DialogResult.OK)
{
GridAdendo.Rows[adendo.IndexAdendo].Cells[2].Value = adendo.Caminho;
GridAdendo.Rows[adendo.IndexAdendo].Cells[3].Value = adendo.Obs;
}
}
Valeu a todos.- Marcado como Resposta LZVRTE segunda-feira, 1 de fevereiro de 2010 18:02
Todas as Respostas
-
Como vc carrega o grid?
Eu geralmente utilizo Listas de objetos para carregar o grid, e jogo esta lista num BindingSource e o Binding para o DataGridView, quando preciso passar para outro formulario, eu passo o objeto inteiro que está selecionado. No outro formulario eu atualizo os dados do objeto, quando o formulario fecha eu dou um ResetBinding no BindingSource, o reset atualiza o DataGrid automaticamente, pois os dados da lista estão todos já atualizados, já que o .Net utiliza apenas uma região de memória para o mesmo objeto. -
Bom dia
Então cara o meu caso é um pouco complicado, eu criei um DataSet que retorna do banco uma grande select quando chega na minha aplicação utilizo linq para filtrar alguma informação do DataSet e retorno o resultado do linq para a grid nesta forma grid.datasource = query.ToList();. Até entao blz, criei um evento q executa quando clico duas vezes numa row, este evento abre um ShowDialog() com alguns TextBoxs com as informações da row clicada, faço a edição dos dados e fecho a caixa de dialogo o certo era essa row ficar atualizada, mas nao fica estou tentando outros metodos. -
Mesmo assim, tenta usar o BindingSource.
http://msdn.microsoft.com/pt-br/library/system.windows.forms.bindingsource.aspx
http://www.macoratti.net/vbn_dgv2.htm
Dá uma pesquisada sobre isto, é a melhor maneira de carregar grids e combos e atualizar seu conteudo.- Sugerido como Resposta Danimar Ribeiro sexta-feira, 29 de janeiro de 2010 12:09
-
-
-
Caro LZVRTE tudo blza?
Me diz uma coisa, quando você carrega o DataSet, voce traz todos os dados dessa tabela, ou traz somente alguns dados filtrados??
Se for apenas os registros filtrados, você pode fazer da seguinte forma, ao fechar o Form2, fazer uma nova consulta na base de dados, e preencher novamente o DataGrid, pois assim você sempre estará carregando os dados que estão salvos na base de dados. Ja mata 02 coelhos com uma cajadada só, Salva os dados e já carrega eles. Usa o campo ID para fazer essa busca ou algum outro campo que seja um indice, pois a consulta é muito mais rápido para carregar.
Se não estiver que listar os dados filtrados, mesmo assim eu ainda usaria a forma acima para atualizar os dados, mesmo que demorasse um pouquinho, seria o mais correto. Você poderia deixar tipo uma mensagem de aguarde para o usuario...
Resumindo, a melhor opção que eu acho é sempre buscar os dados que estão na base de dados.
Espero ter ajudado.
Eduardo Nogueira- Sugerido como Resposta esnfile segunda-feira, 1 de fevereiro de 2010 17:38
-
Blz Cara
Então depois de quebrar muito a cabeça consegui resolver, é o seguinte:
No form1 a pessoa digita o CPF ou CNPJ de um cliente e clica no btnPesquisar, caso exista este documento digitado me retornara um DataSet com uma tabela grande, tenho q dar pouco custo para o servidor então resolvi usar Linq em cima do DataSet para não ter q ir novamente até a base, mesmo pq os dados q estam no DataSet é o necessario, então resolvi fazer o seguinte:
form1
o btnPesquisar tem um evento click e dentro dele tem o código:
GridDadosContrato.Rows.Clear();
GridAdendo.Rows.Clear();
Contratos.DAL.
EditContratados editCont = new Contratos.DAL.EditContratados();
DataSet ds = new DataSet();
ds = editCont.BuscarContratado(txtCPF_CNPJ_Edit.Text);
txtNome.Text = ds.Tables[0].Rows[0][1].ToString();
txtCEP.Text = ds.Tables[0].Rows[0][2].ToString();
txtEndereco.Text = ds.Tables[0].Rows[0][3].ToString();
txtBairro.Text = ds.Tables[0].Rows[0][4].ToString();
txtComplemento.Text = ds.Tables[0].Rows[0][5].ToString();
txtCidade.Text = ds.Tables[0].Rows[0][6].ToString();
txtUF.Text = ds.Tables[0].Rows[0][7].ToString();
txtDDD.Text = ds.Tables[0].Rows[0][8].ToString();
txtTelefone.Text = ds.Tables[0].Rows[0][9].ToString();
txtFax.Text = ds.Tables[0].Rows[0][10].ToString();
txtResponsavel.Text = ds.Tables[0].Rows[0][11].ToString();
txtDocs.Text = ds.Tables[0].Rows[0][12].ToString();
var query =
from c in ds.Tables[0].AsEnumerable()
select new
{
ID = c.Field<
int>(13),
Caminho = c.Field<
string>(15),
Valor = c.Field<
decimal>(16).ToString("0.##"),
Data_Contrato = c.Field<
DateTime>(14),
Vigencia = c.Field<
DateTime>(17),
Situacao = c.Field<
bool>(18),
Obs = c.Field<
string>(19)
};
for (int i = 0; i < query.Count(); i++)
{
GridDadosContrato.Rows.Add(
new DataGridViewRow());
GridDadosContrato.Rows[i].Cells[
"ID"].Value = query.ElementAt(i).ID;
GridDadosContrato.Rows[i].Cells[
"Caminho"].Value = query.ElementAt(i).Caminho;
GridDadosContrato.Rows[i].Cells[
"Valor"].Value = query.ElementAt(i).Valor;
GridDadosContrato.Rows[i].Cells[
"DataContrato"].Value = query.ElementAt(i).Data_Contrato.ToShortDateString();
GridDadosContrato.Rows[i].Cells[
"Vigencia"].Value = query.ElementAt(i).Vigencia.ToShortDateString();
GridDadosContrato.Rows[i].Cells[
"Situacao"].Value = query.ElementAt(i).Situacao;
GridDadosContrato.Rows[i].Cells[
"OBS"].Value = query.ElementAt(i).Obs;
}
var queryAdendo =
from c in ds.Tables[0].AsEnumerable()
where !c.IsNull("IDAdendo")
select new
{
ID = c.Field<
int>(20),
ID_Contrato = c.Field<
int>(21),
Caminho = c.Field<
string>(22),
Obs = c.Field<
string>(23)
};
for (int i = 0; i < queryAdendo.Count(); i++)
{
GridAdendo.Rows.Add(
new DataGridViewRow());
GridAdendo.Rows[i].Cells[
"ID_Adendo"].Value = queryAdendo.ElementAt(i).ID;
GridAdendo.Rows[i].Cells[
"ID_Contrato"].Value = queryAdendo.ElementAt(i).ID_Contrato;
GridAdendo.Rows[i].Cells[
"Caminho_Adendo"].Value = queryAdendo.ElementAt(i).Caminho;
GridAdendo.Rows[i].Cells[
"OBS_Adendo"].Value = queryAdendo.ElementAt(i).Obs;
}
Para eu editar algum dado numa das grids, preciso clicar 2 vezes e então abrirá um form no estilo ShowDialog com os campos da grid, quando termino de editar clico no botão salvar e pronto salvo os dados editados no grid, quando não tiver mais nada para editar clico no btnSalvarDados e as informações vão para a base para atualizar.
código da GridDadosContrato evento CellDoubleClick
frmEditContrato
contrato = new frmEditContrato();
contrato.ID = (
int)GridDadosContrato.Rows[e.RowIndex].Cells[0].Value;
contrato.Caminho = GridDadosContrato.Rows[e.RowIndex].Cells[1].Value.ToString();
contrato.Valor =
decimal.Parse(GridDadosContrato.Rows[e.RowIndex].Cells[2].Value.ToString());
contrato.DataContrato =
Convert.ToDateTime(GridDadosContrato.Rows[e.RowIndex].Cells[3].Value);
contrato.Vigencia =
Convert.ToDateTime(GridDadosContrato.Rows[e.RowIndex].Cells[4].Value);
contrato.Situacao =
Convert.ToBoolean(GridDadosContrato.Rows[e.RowIndex].Cells[5].Value);
contrato.Obs = GridDadosContrato.Rows[e.RowIndex].Cells[6].Value.ToString();
contrato.index = e.RowIndex;
if (contrato.ShowDialog(this) == DialogResult.OK)
{
GridDadosContrato.Rows[contrato.index].Cells[1].Value = contrato.Caminho;
GridDadosContrato.Rows[contrato.index].Cells[2].Value = contrato.Valor;
GridDadosContrato.Rows[contrato.index].Cells[3].Value = contrato.DataContrato.ToShortDateString();
GridDadosContrato.Rows[contrato.index].Cells[4].Value = contrato.Vigencia.ToShortDateString();
GridDadosContrato.Rows[contrato.index].Cells[5].Value = contrato.Situacao;
GridDadosContrato.Rows[contrato.index].Cells[6].Value = contrato.Obs;
}
código da GridAdendo evento CellDoubleClic
private
void GridAdendo_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
frmEditAdendo adendo = new frmEditAdendo();
adendo.IDAdendo = (
int)GridAdendo.Rows[e.RowIndex].Cells[0].Value;
adendo.IDContrato = (
int)GridAdendo.Rows[e.RowIndex].Cells[1].Value;
adendo.Caminho = GridAdendo.Rows[e.RowIndex].Cells[2].Value.ToString();
adendo.Obs = GridAdendo.Rows[e.RowIndex].Cells[3].Value.ToString();
adendo.IndexAdendo = e.RowIndex;
if (adendo.ShowDialog(this) == DialogResult.OK)
{
GridAdendo.Rows[adendo.IndexAdendo].Cells[2].Value = adendo.Caminho;
GridAdendo.Rows[adendo.IndexAdendo].Cells[3].Value = adendo.Obs;
}
}
Valeu a todos.- Marcado como Resposta LZVRTE segunda-feira, 1 de fevereiro de 2010 18:02