none
Passar valor de TextBox no form2 para DataGridView no form1 RRS feed

  • 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.
    quinta-feira, 21 de janeiro de 2010 16:04

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
    segunda-feira, 1 de fevereiro de 2010 18:01

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.
    sexta-feira, 22 de janeiro de 2010 11:37
  • 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.
    sexta-feira, 22 de janeiro de 2010 11:54
  • 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
    sexta-feira, 22 de janeiro de 2010 12:16
  • Valeu carinha não tenho muito conhecimento sobre esta classe, vou estudar um pouco e ver se consigo resolver este problema quando terminar posto o codigo e uma explicação

    abraços fica com Deus.
    sexta-feira, 22 de janeiro de 2010 12:23
  • Cara, dá uma olhada nesta thread: http://social.msdn.microsoft.com/Forums/pt-BR/clientept/thread/b028ad45-0745-4336-91e0-f5df21e7b082.
    De repente d ajuda.
    Falou
    segunda-feira, 25 de janeiro de 2010 14:56
  • 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
    sexta-feira, 29 de janeiro de 2010 20:51
  • 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
    segunda-feira, 1 de fevereiro de 2010 18:01