Popular Datagridview Editable C#

Asked

Viewed 34 times

-2

I made a Product Type Editing Form where he has a Usercontrol with the list of Additional Field Types.

In the add method everything is right.

In Usercontrol has an editable Datagridview where I created a Datagridviewtextboxcolumn and a visible Datagridviewcomboboxcolumn.

I populate the Combobox with the types of field formats available in the database, it is only what the user can select (String, Int32 etc).

Man problem is popular the Datagridview with the model data for editing.

I use a Repository to receive all data from the database returning a Model.

All the research I’ve done points to the use of SQL statement directly in the Form. What I can’t do is not leave the chosen pattern. (it’s a mix of MVVM and MVC) done with the little knowledge I still have. "It’s a real mess but I won’t get into this".

Tipoprodutolistuc.Cs:

    //chamado do formulário para edição do Tipo de Produto
    //mesmo formulário utilizado para Edit e Add
private void btnEdit_Click(object sender, EventArgs e)
        {
            this.TipoProdutoModel = _tipoProdutoServices.GetById(int.Parse(this.dgvTiposProdutos.CurrentRow.Cells[0].Value.ToString()));
            TipoProdutoAddForm tipoProdutoForm = new TipoProdutoAddForm(this.CatalogoForm, this);
            tipoProdutoForm.Text = "Editando Tipo de Produto";
            tipoProdutoForm.TipoProdutoModel = this.TipoProdutoModel;
            tipoProdutoForm.CatalogoModel = this.CatalogoModel;
            tipoProdutoForm.StartPosition = FormStartPosition.CenterScreen;
            tipoProdutoForm.ShowDialog();
            this.TiposProdutosListUC_Load(sender, e);
        }

Typoprodutoaddform.Cs:

TipoProdutoAddForm

private void LoadUserControlCamposAdicionais()
        {
            camposAdicionais = new CamposTiposProdutosListUC(this);
            camposAdicionais.TipoProdutoModel = this.TipoProdutoModel;
            panelCampos.Controls.Clear();
            panelCampos.Controls.Add(camposAdicionais);
            camposAdicionais.Dock = DockStyle.Fill;
        }

Calling the Add or Update method

//a função ADICIONAR é feita todo no TipoProdutoAddForm.
//Quero fazer a função Update em seguida. Também toda nele.
       private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (ValidateChildren(ValidationConstraints.Enabled))
            {
                if (this.TipoProdutoModel.TipoProdutoId != 0)
                {
                    try
                    {

                        TipoProdutoUpdate();
                        CampotipoUpdate();
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Não foi possível atualizar o Tipo de Produto", "Atualizando Tipo de Produto");
                    }
                }
                else
                {
                    try
                    {
                        this.TipoProdutoModel = TipoProdutoAdd();
                        this.ListaCamposAdicionais = CampoTipoAdd();
                        MessageBox.Show($"Tipo de Produto Adicionado com sucesso", "Adicionando Tipo de Produto");

                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Não foi possível adicionar o Tipo de Produto");
                    }
                }


            }
        }

Method Typoprodutoadd()

        private TipoProdutoModel TipoProdutoAdd()
        {
            TipoProdutoModel returnedModel = new TipoProdutoModel();

            this.TipoProdutoModel = new TipoProdutoModel()
            {
                CatalogoId = this.CatalogoModel.CatalogoId,
                Descricao = this.textTipoProduto.Text
            };

            bool operationSucceeded = false;
            string dataAccesStatusJsonStr = string.Empty;
            string formattedJsonStr = string.Empty;

            try
            {
                returnedModel = _tipoProdutoServices.Add(this.TipoProdutoModel);

            }
            catch (DataAccessException e)
            {
                operationSucceeded = e.DataAccessStatusInfo.OperationSucceeded;
                dataAccesStatusJsonStr = JsonConvert.SerializeObject(e.DataAccessStatusInfo);
                formattedJsonStr = JToken.Parse(dataAccesStatusJsonStr).ToString();
                MessageBox.Show(formattedJsonStr, "Não foi possível adicionar o Tipo de Produto", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }



            if (operationSucceeded)
            {
                MessageBox.Show("Registro Salvo com sucesso", "Salvando Tipo  do Distribuidor", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }

            return returnedModel;
        }

Campotipoadd method()

        private List<CampoTipoProdutoModel> CampoTipoAdd() //que que eu vou fazer com a lista retornada???
        {
            List<CampoTipoProdutoModel> modelList = new List<CampoTipoProdutoModel>();
            DataGridViewRowCollection rowsCamposAdicionais;
            rowsCamposAdicionais = this.camposAdicionais.dgvCampos.Rows; //peguei as linhas do DATAGRID
                                                                         //modelList = camposAdicionais.dgvCampos.Columns.

            bool operationSucceeded = false;
            string dataAccesStatusJsonStr = string.Empty;
            string formattedJsonStr = string.Empty;

            foreach (DataGridViewRow row in rowsCamposAdicionais)
            {
                if (row.Cells["ColumnNome"].Value != null)
                {
                    CampoTipoProdutoModel model = new CampoTipoProdutoModel();
                    model.Nome = row.Cells["ColumnNome"].Value.ToString();
                    model.FormatoId = int.Parse(row.Cells["ColumnFormato"].Value.ToString());
                    model.TipoProdutoId = this.TipoProdutoModel.TipoProdutoId;
                    modelList.Add(model);
                }
            }

            if (modelList.Count != 0)
            {
                foreach (CampoTipoProdutoModel model in modelList)
                {
                    try
                    {
                        _campoTipoProdutoServices.Add(model);

                    }
                    catch (DataAccessException e)
                    {
                        operationSucceeded = e.DataAccessStatusInfo.OperationSucceeded;
                        dataAccesStatusJsonStr = JsonConvert.SerializeObject(e.DataAccessStatusInfo);
                        formattedJsonStr = JToken.Parse(dataAccesStatusJsonStr).ToString();
                        MessageBox.Show(formattedJsonStr, "Não foi possível adicionar o Tipo de Produto", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
            }
            return modelList;

        }

Now comes the Icing on the Cake: The Usercontrol that has the list of Product Types.

Campostipsproductslistuc.Cs:

DataGridView

DataGridViewComboBoxColumn

//Todos esse IF’s são para identificar se está adicionando ou atualizando.
//caso null está adicionando.
//esse !=0 é para não dá erro pois ele pega a Lista de Campos pelo ID do Tipo de Produto. 
        private void CamposTiposProdutosListUC_Load(object sender, EventArgs e)
        {
            try
            {

                if (this.TipoProdutoModel != null)
                {
                    if (this.TipoProdutoModel.TipoProdutoId != 0)
                    {
                        ListaCampos = (List<CampoTipoProdutoModel>)_camposServices.GetAllByTipoProdutoId(TipoProdutoModel.TipoProdutoId);
                    }
                }
                ConfiguraDGV();

            }
            catch (Exception)
            {

                throw;
            }
        }

Configured Method gv()


//Configurando e populando a DataGrid.
//meu problema está aqui.
        private void ConfiguraDGV()
        {

            PopulaComboBoxFormatos();

            if (ListaCampos != null)
            {
                if (ListaCampos.Count > 0)
                {
                    this.ListaCampos = PopulaDgv();

                    dgvCampos.VirtualMode = true;
                    dgvCampos.AutoSize = true;
                    dgvCampos.AutoGenerateColumns = false;
                    dgvCampos.DataSource = this.ListaCampos; //vai antes ou depois dos foreaches?

                    //pra cada linha adiciona um model da lista
                    foreach (CampoTipoProdutoModel modelCampo in this.ListaCampos)
                    {
                        foreach (DataGridViewRow row in dgvCampos.Rows)
                        {
//Não sei mais o que fazer para os dados do Model ir para o DataGridView
                            row.Cells["ColumnCampoTipoId"].Value = modelCampo.CampoTipoId.ToString();
                            row.Cells["ColumnNome"].Value = modelCampo.Nome.ToString();
                            row.Cells["ColumnFormato"].Value = modelCampo.FormatoId;
                            row.Cells["ColumnTipoProdutoId"].Value = modelCampo.TipoProdutoId;

                        }
                    }
                }
            }
        }

And last but not least: The Populacomboboxformato method()

        public void PopulaComboBoxFormatos()
        {
            List<FormatoCampoModel> modelsFormatos = new List<FormatoCampoModel>();
            try
            {

                modelsFormatos = (List<FormatoCampoModel>)_formatoServices.GetAll();

            }
            catch (Exception)
            {

                throw;
            }

            ColumnFormato.ValueMember = "FormatoId";
            ColumnFormato.DisplayMember = "Nome";
            ColumnFormato.Items.Clear();
            foreach (var model in modelsFormatos)
            {
                ColumnFormato.Items.Add(model);
            }

        }

I’ve tried to get the line cells to load the Model data, but I don’t know what else to do. If I switch to Datatable I get lost to fill the Combobox. I want to be able to fill out the grid data with the models. I’ve done my research anyway. I had to restore the files in GIT several times pq when I try to fix using Datatable I can’t read the Combobox items anymore. If someone could give me a light I’d really appreciate it.

  • "My problem is popular Datagridview with Model data " Datagridview accepts as date a List for example, just create a List<Model> and use on the property DataSource and call the Métod Bind() that will work

  • So I don’t need to do this foreach. I can just use Listcampos, which is already a List<model> and use it in Datasource. I’ll see some details about Bind(). I’ve never used it. I’ll try... dpois give feedback. vlw

  • There is another question: the Datagrid Model returns an integer of the Format. The Text Format for the user comes from the Columnformat Combobox. It won’t go bad?

  • @Ricardopunctual I was already using Datasource=this.Listfields This Listfields is a List<Model>. I didn’t want it to generate the columns automatically because I have to treat the second column who in the Model has an ID. And I have to pass the data of Other Model that is in Combobox.

1 answer

0


I solved one problem and came across another.

@Ricardopunctual I think you don’t understand the problem. But thanks anyway for the help.

First to bring the Model to Datagrid I used an example from Docs from Microsoft passing a string array with the found Model values.

Configured Method gv()

This one gets only one and used a for for each item of List<ListaCampos>.

Those row.Cells do not help at all because the value is always null.

I removed the DataSource, because I will manually generate through the Array, in addition to removing Virtualmode for manually popular power lines.

So It Stayed That Way:

private void ConfiguraDGV()
{
   PopulaComboBoxFormatos();
   if (ListaCampos != null)
   {
      if (ListaCampos.Count > 0)
      {
        this.ListaCampos = PopulaDgv();
        //dgvCampos.VirtualMode = true;
        dgvCampos.AutoSize = true;
        dgvCampos.AutoGenerateColumns = false;
        //dgvCampos.DataSource = this.ListaCampos;
        
        
        //pra cada linha adiciona um model da lista
        foreach (CampoTipoProdutoModel modelCampo in this.ListaCampos)
        {
            //para cada registro da LIsta de Campos adiciona um array à linha do DGV.
            for (int i = 0; i < ListaCampos.Count; i++)
            {
                string[] stringRow =
                {
                    modelCampo.CampoTipoId.ToString(),
                    modelCampo.Nome.ToString(),
                    //O Nome do Formato vem de outro Model, mas busquei do Repository diretamente.
                    //TODO: Melhorar isso
                    _formatoServices.GetById(modelCampo.FormatoId).Nome.ToString()
                };
                dgvCampos.Rows.Add(stringRow);
            }
            
        }
      }
   }
}

Second Problem Combobox was set up wrong. I changed the Valuemember of Formatoid to Name problem solved.

ColumnFormato.DataPropertyName = "FormatoId";
ColumnFormato.ValueMember = "Nome";
ColumnFormato.DisplayMember = "Nome";
ColumnFormato.Items.Clear();
foreach (var model in modelsFormatos)
{
 ColumnFormato.Items.Add(model);
}

Stay there for those who have the same problem I had. If you find a better solution, let me know.

Thanks again @Ricardopunctual for the help. It has served a lot for me to seek further development.

Browser other questions tagged

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