-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:
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:
//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 aList<Model>
and use on the propertyDataSource
and call the MétodBind()
that will work– Ricardo Pontual
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
– Michlos
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?
– Michlos
@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.
– Michlos