Pulling repeated data from the database to Datagridview

Asked

Viewed 97 times

1

I’m working on a c# project where I have a form TelaInicio where there is a DataGridView where all bank information is loaded and for this I have created a method called CarregarGrid() in form TelaInicio

public void CarregarGrid()
    {
        try{
        //indico o número de colunas
        dgvDados.ColumnCount = 14;
        objConnection = new MySqlConnection(caminho);
        //instância do comando onde passo
        //o sql e a conexão como parâmetro
        objComando =  new MySqlCommand("SELECT * FROM checagens" , objConnection);
        //abro a conexão
        objConnection.Open();
        //instâncio o leitor
        var leitor = objComando.ExecuteReader();
        //enquanto leitor está lendo

        while (leitor.Read())
        {
            //insiro os dados no dgvDados
            dgvDados.Rows.Add(leitor[0].ToString(),
                leitor[1].ToString(),
                leitor[2].ToString(),
                leitor[3].ToString(),
                leitor[4].ToString(),
                leitor[5].ToString(),
                leitor[6].ToString(),
                leitor[7].ToString(),
                leitor[8].ToString(),
                leitor[9].ToString(),
                leitor[10].ToString(),
                leitor[11].ToString(),
                leitor[12].ToString(),
                leitor[13].ToString());

        }
    }

I call this method no Form_Load of TelaInicio

 private void TelaInicio_Load(object sender, EventArgs e)
    {
        CarregarGrid();
        dgvDados.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
        dgvDados.Columns[0].Name = "CNPJ";
        dgvDados.Columns[1].Name = "DATA";
        dgvDados.Columns[2].Name = "RAZÃO SOCIAL";
        dgvDados.Columns[3].Name = "OPERADORA";
        dgvDados.Columns[4].Name = "LINHAS";
        dgvDados.Columns[5].Name = "VIGENCIA";
        dgvDados.Columns[6].Name = "CONTRATO";
        dgvDados.Columns[7].Name = "VALOR GASTO";
        dgvDados.Columns[8].Name = "FIXO EMPRESA";
        dgvDados.Columns[9].Name = "GESTOR";
        dgvDados.Columns[10].Name = "CELULAR";
        dgvDados.Columns[11].Name = "FIXO GESTOR";
        dgvDados.Columns[12].Name = "EMAIL";
        dgvDados.Columns[13].Name = "OBSERVAÇÕES";
        lblRegistros.Text = (dgvDados.Rows.Count - 1).ToString();    

    }

Until then ok he pulls all the data right to the DataGridView, but I have another form called Cadastrar where in it I register all the information and thence already go straight to the bank, however if I leave the CarregarGrid() only in the Form_Load every time I make a new registration for him to update the Grid I will have to open and close the program, thinking to avoid this I instated the method and I am calling him after the click of button Register in the Form Cadastrar

 private void btncadastrar_Click_1(object sender, EventArgs e)
    {
        DateTime inicio = dtpvigencia.Value;
        DateTime fim = DateTime.Now;
        int mesesDiff = ajustaMesAno(fim) - ajustaMesAno(inicio);
        if (inicio.Day > fim.Day)
        {
            mesesDiff--;
        }


        Checagem checagem = new Checagem();
        checagem.Cnpj = txtcnpj.Text;
        checagem.Razao = txtrazao.Text;
        checagem.Operadora = cmboperadora.Text;
        checagem.Linhas = txtlinhas.Text;
        checagem.Vigencia = dtpvigencia.Text;
        checagem.MesesContrato = mesesDiff.ToString();
        checagem.ValorGasto = txtvalorgasto.Text;
        checagem.Fixoempresa = txtfixoempresa.Text;
        checagem.Gestor = txtgestor.Text;
        checagem.Celular = txtcelular.Text;
        checagem.Fixogestor = txtfixogestor.Text;
        checagem.Email = txtemail.Text;
        checagem.Obs = txtobs.Text;


        if (cadchecagem(checagem))
        {

            MetroFramework.MetroMessageBox.Show(this, "Dados cadastrados com sucesso ", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            Utilidades.Funcoes.LimparCampos(gbchecagem);
            this.telainicio.CarregarGrid(); //Chamada do método


        }
    }

The problem is that after clicking the button it loads all the information that is already in the DataGridView all over again I wish that didn’t happen that he updated only with the registration that was made at that time, I’ve been thinking of several ways but I haven’t succeeded.

2 answers

1


According to your code the solution would be to clear the list before loading, could use the this.dgvDados.Rows.Clear();

Would look like this:

public void CarregarGrid()
{
    try{

    // 
    this.dgvDados.Rows.Clear();

    //indico o número de colunas
    dgvDados.ColumnCount = 14;
    objConnection = new MySqlConnection(caminho);
    //instância do comando onde passo
    //o sql e a conexão como parâmetro
    objComando =  new MySqlCommand("SELECT * FROM checagens" , objConnection);
    //abro a conexão
    objConnection.Open();
    //instâncio o leitor
    var leitor = objComando.ExecuteReader();
    //enquanto leitor está lendo

    while (leitor.Read())
    {
        //insiro os dados no dgvDados
        dgvDados.Rows.Add(leitor[0].ToString(),
            leitor[1].ToString(),
            leitor[2].ToString(),
            leitor[3].ToString(),
            leitor[4].ToString(),
            leitor[5].ToString(),
            leitor[6].ToString(),
            leitor[7].ToString(),
            leitor[8].ToString(),
            leitor[9].ToString(),
            leitor[10].ToString(),
            leitor[11].ToString(),
            leitor[12].ToString(),
            leitor[13].ToString());

    }
}

Other Solution

Another way to present the data in gridview and in a more organized way would be using the dataGridView.DataSource, he gets an obejcto, you could organize your data into example classes:

  • Creates a class Checagens where you will have all your attributes

    public class Checagens
    {
      public string Atributo1{ get; set; }
      public string Atributo2{ get; set; }
    }
    
  • Create another class for operations with the database referring to that class or table, example: save, edit, queries etc...

       public class ChecagensBLL
       {
          public void Gravar()
          {
    
          }
    
          public void Editar()
          {
    
          }
    
          // E outros médotos
         public List<Checagens> Listar()
         {
            List<Checagens>  lista= new List<Checagens>();
    
           // Aqui coloque o teu código e preencha a lista
    
          return lista;
         }
    
    }
    
  • In your method load grid would be that jetio:

    public void CarregarGrid()
    {
        ChecagensBLL bll = new ChecagensBLL();
        List<Checagens> lista = bll.Listar();
        dgvDados.DataSource = lista;
    
    }
    

    To customize or organize columns

    syntax: dgvDados.Columns[column position]. Properties(Headertext,Visible etc...)

    To edit the first column text:

    public void CarregarGrid()
    {
        ChecagensBLL bll = new ChecagensBLL();
        List<Checagens> lista = bll.Listar();
        dgvDados.DataSource = lista;
    
        if(dgvDados.RowCount>0)
        {
           dgvDados.Columns[0].HeaderText="CNPJ";
        }
    }
    
  • the this.dgvDados.Rows.Clear(); already solved the situation thank you very much, but what you mentioned is an interesting alternative

1

Try to put earlier on the first line of public void CarregarGrid() the code: dgvDados.Update(); dgvDados.Refresh();

Browser other questions tagged

You are not signed in. Login or sign up in order to post.