Loading Grid data with CheckBoxColumn

2

I'm creating a form to register a license for a product.

This form serves to record which solution a client has.

In the form to add a product you only have to select product and customer .

I'm having a hard time crafting the loading logic for the form that sets " checked " to the products that this client already has.

My initial idea is to make two queries that return a DataTable , the first query the existing products, the second brings the products that the client owns.

First Consultation

SELECT id, nome
FROM   produto

Second Consultation

SELECT produto_id
FROM licenca
JOIN produto on produto_id = produto.id
join pessoa on pessoa.id   = cliente_id
where cliente_id           = @id

So in loading it during the loop it will make the comparison leaving it checked the ones it already has.

foreach (DataRow row in ProdutosCLiente.Rows)
                {
                    int id = (int)row["produto_id"];
                    GridProduto.Rows[id].Cells[0].Value = CheckState.Checked;
                }

Can anyone tell me what would be the correct way to reference the values that will be filled? I'm having trouble making reference during loop .

    
asked by anonymous 10.03.2016 / 13:02

2 answers

0

I was able to resolve using some properties of Telerik :

 private void radMultiColumnComboBoxPessoa_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                //Finaliza algum editor em aberto - Grid
                GridProduto.GridViewElement.EditorManager.EndEdit();

                //Inicia atualização - Grid
                GridProduto.TableElement.ViewTemplate.BeginUpdate();

                //Verifica se a pessoa foi selecionada
                if (radMultiColumnComboBoxPessoa.SelectedIndex >= 0)
                {
                    //Obtem a id do cliente selecionado 
                    int Cliente_id = (int)radMultiColumnComboBoxPessoa.EditorControl.Rows[radMultiColumnComboBoxPessoa.SelectedIndex].Cells["id"].Value;

                    //Armazena os produtos que o cliente possui
                    DataTable dataTableLicenca = Negocio.Licenca.Listar(Cliente_id);

                    var produto_ids = (from row in dataTableLicenca.AsEnumerable()
                                       select (int)row.GetValue("produto_id"));

                    foreach (var row in GridProduto.Rows)
                    {
                        if (row is GridViewDataRowInfo)
                        {
                            //Produto
                            int produto_id = (int)((System.Data.DataRowView)(row.DataBoundItem)).Row.GetValue("id");

                            //Valor a ser definido            
                            bool valueState = produto_ids.Contains(produto_id) ? true : false;

                            //Atualiza valor
                            row.Cells[0].Value = valueState;
                        }
                    }
                }
                else
                {
                    foreach (var row in GridProduto.Rows)
                    {
                        if (row is GridViewDataRowInfo)
                        {
                            //Atualiza valor
                            row.Cells[0].Value = false;
                        }
                    }
                }
    
14.03.2016 / 12:28
1

The Rows property of the GridView is an array containing the rows of it, access to that array is by the row index, not by the id of the product as you are doing it. To do what you want it will take a loop inside another loop, for example:

foreach (DataRow row in ProdutosCLiente.Rows)
{
     int id = (int)row["produto_id"];
     foreach (DataRow rowGrid in GridProduto.Rows)
     {
         if (id == int.Parse(rowGrid.Cells[(Aqui vai o índice da coluna contendo o id do produto)].Value))
         {
             rowGrid.Cells[0].Value = CheckState.Checked;
             break;
         }
     }
}

@Edit:

An easier way to do this is to use only one query to populate the grid, bringing a column that represents whether the user has the product or not. First, in the Checkbox field of your grid, you need to put the following:

<asp:CheckBox ID="id" runat="server" Checked='<%# Convert.ToBoolean(Eval("PossuiProduto")) %>' />

And then you modify the select to return that column using a CASE

SELECT produto.id, produto.nome, CASE WHEN licenca.cliente_id IS NULL THEN 1
 ELSE 0
 END AS PossuiProduto
FROM produto
LEFT JOIN licenca on licenca.produto_id = produto.id
where (licenca.cliente_id = @id OR licenca.cliente_id IS NULL)
    
10.03.2016 / 13:11