Jump to content
Flavio dos Reis

Problema ao enviar linha de uma datagridview para outro

Recommended Posts

Flavio dos Reis

Boa noite.

Quero passar linha(s) de uma datagridview para uma outra datagridview em formulários diferentes. Após selecção da(s) linha(s), usando checkbox, utilizo um botão para passar a(s) linha(s) seleccionadas. O meu problema encontra-se no botão que após escolher uma linha e passando para o outro datagridview a linha é passada mas ao escolher uma segunda linha a linha escolhida anteriormente continua com o valor true mesmo não estando selecionada. Isso faz com que repita a linha seleccionada anteriormente.

Como faço para evitar a repeticao das linhas?

//eis o codigo que carrega a datagridview com o checkbox para seleccionar as linhas 
private void carregaDados()
        {
            db = new BDconexao.accessBD();
            dataGridView1.DataSource = null;
            dataGridView1.Rows.Clear();
            dataGridView1.Refresh();

            string connectionString = db.getConnectionString();
            //string query = "SELECT * FROM   protese UNION (SELECT * FROM tratamento_estomat) ";
            //string query = "SELECT id, descricao, codigo, preco_clinica, comparticipacao_perc, comparticipacao_max,comparticipacao_inps,comparticipacao_segurado, total_tratamento   FROM   protese  ";
            //query += "UNION (SELECT id, descricao, codigo, preco_clinica, comparticipacao_perc, comparticipacao_max, comparticipacao_inps,comparticipacao_segurado, total_tratamento FROM tratamento_estomat)";
            string query = "SELECT * FROM ((SELECT id, descricao, codigo, preco_clinica, comparticipacao_perc, comparticipacao_max,comparticipacao_inps,comparticipacao_segurado, total_tratamento FROM protese)";
            query += "UNION (SELECT id, descricao, codigo, preco_clinica, comparticipacao_perc, comparticipacao_max, comparticipacao_inps, comparticipacao_segurado, total_tratamento FROM tratamento_estomat) )";
            query += "AS tb ";

            using (MySqlConnection conn = new MySqlConnection(connectionString))
            {
                using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn))
                {
                    try
            {
                        //******
                        DataTable dataTable = new DataTable();

                        

                        DataGridViewCheckBoxColumn dgvcCheckBox = new DataGridViewCheckBoxColumn();
                        dgvcCheckBox.HeaderText = "Marcar";
                        
                        dgvcCheckBox.Name = "Marcar";
                        dgvcCheckBox.ReadOnly = false;
                        dgvcCheckBox.FalseValue = "False";
                        dgvcCheckBox.TrueValue = "True";
                        dataGridView1.Columns.Insert(9, dgvcCheckBox);
                    

                        //******
                        
                        adapter.Fill(dataTable);

                        for (int i = 0; i < dataTable.Rows.Count; i++)
                        {
                            dataGridView1.Rows.Add(dataTable.Rows[i][0], dataTable.Rows[i][2], dataTable.Rows[i][1], dataTable.Rows[i][3], dataTable.Rows[i][4], dataTable.Rows[i][5], dataTable.Rows[i][6], dataTable.Rows[i][7], dataTable.Rows[i][8]);
                        }
                        dataGridView1.AllowUserToAddRows = false;
                        dataGridView1.AllowUserToDeleteRows = false;

                       
                    }

                    catch (Exception ex)
                    {
                        MessageBox.Show("Error" + ex);
                    }

               }
            }
        }
//codigo para o botao passar dados
 private void passadados()
        {
            try
              {
                //DataTable dataTable = new DataTable();

                //// string message = string.Empty;
                ////loop to check if the checkbox cell is checked
                for (int i = 0; i <= dataGridView1.Rows.Count - 1; i++)
                // for (int i = dataGridView1.RowCount - 1; i >= 0; i--)
                {
                    if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[9].Value) == true)
                    {
                        RecordId = RecordId + dataGridView1.Rows[i].Cells["Codigo"].Value.ToString() + ",";
                        //RecordId = dataGridView1.Rows[i].Cells["Codigo"].Value.ToString() + "," ;
                        MessageBox.Show("selected Id " + RecordId + "check" + dataGridView1.Rows[i].Cells[9].Value.ToString());
                        // RemoveDuplicate(dataGridView1);
                    }
                    else
                        MessageBox.Show("Selecione um item");
                }

                

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error" + ex);
            }
            //*******

        }

 

Obrigado a todos, agradecendo antecipadamente a vossa ajuda.

 

Share this post


Link to post
Share on other sites
_Rest_

Não percebi muito bem o que estás a fazer. O que pretendes é carregar num botão e todas as Rows que estejam checkadas numa grid sejam copiadas para outra grid, é isso?

Share this post


Link to post
Share on other sites
Flavio dos Reis

É exactamente isso ao carregar num botao enviar as Rows checkadas para o outro grid. Já faço isso mas sempre que carrego no botão para enviar uma nova linha, adiciona novamente as linhas selecionadas anteriormente.

Share this post


Link to post
Share on other sites
_Rest_

Não tive muito tempo hoje, mas depois vejo o codigo. Mete só o metodo completo que estás a usar. Eu fiz agora um teste rapido mas como uso infragistics tive que converter UltraGridRow para DataRow. Mas se adicionares as rows para uma lista de DataRows depois é so passares essas para a DataTable.

 

            List<DataRow> ListaRowsCheckadas = grd1.Rows.Where(x => (bool)x.Cells["Sel"].Value == true).Select(x => ((DataRowView)x.ListObject).Row).ToList();

Se quiseres passar a lista para uma dataTable fazes 

ds1.Tables.Add(ListaRowsCheckadas.CopyToDataTable());

se queres ir adicionando a que já tens na outra grid, percorres cada item da lista ou cada row do dataset e adicionas.

Depois tens que limpar as checks da grid antiga. Se o problema é só elas continuarem chekadas, antes de fazeres o bind à primeira grid, fazes um clone  datatable e depois quando passas as chekadas dps igualas as datatables para voltar ao estado inicial, como se fizesses um Undo

Share this post


Link to post
Share on other sites
Flavio dos Reis

Obrigada pela reposta.Esqueci-me de mencionar que trata-se de uma aplicação WindowsForm com C# e mysql.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.