CHECKBOX EM DATAGRIDVIEW

LUIS.HERRERA 06/08/2013 15:53:04
#427088
Amigos tô com 2 grandes dificuldades em manipular Checkbox no grid.

Tenho uma rotina que formata o grid, sempre antes dele ser carregado com um list assim:

public void MontaGridJaAssociadas()
{
gridPerguntasJaAssociadas.DataSource = null;
gridPerguntasJaAssociadas.Columns.Clear();

// criando as colunas
gridPerguntasJaAssociadas.Columns.Add([Ô]IDPergunta[Ô], [Ô]IDPergunta[Ô]);
gridPerguntasJaAssociadas.Columns[0].DataPropertyName = [Ô]IDPergunta[Ô];
gridPerguntasJaAssociadas.Columns[0].Visible = false;
gridPerguntasJaAssociadas.Columns.Add([Ô]IDCargo[Ô], [Ô]IDCargo[Ô]);
gridPerguntasJaAssociadas.Columns[1].DataPropertyName = [Ô]IDCargo[Ô];
gridPerguntasJaAssociadas.Columns[1].Visible = false;
gridPerguntasJaAssociadas.Columns.Add([Ô]PERGUNTA[Ô], [Ô]Perguntas[Ô]);
gridPerguntasJaAssociadas.Columns[2].DataPropertyName = [Ô]PERGUNTA[Ô];
gridPerguntasJaAssociadas.Columns[2].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
gridPerguntasJaAssociadas.Columns[2].Width = 280;
gridPerguntasJaAssociadas.Columns[2].DividerWidth = 1;
gridPerguntasJaAssociadas.Columns[2].Visible = true;
gridPerguntasJaAssociadas.Columns.Add([Ô]GRUPO[Ô], [Ô]Grupo[Ô]);
gridPerguntasJaAssociadas.Columns[3].DataPropertyName = [Ô]GRUPO[Ô];
gridPerguntasJaAssociadas.Columns[3].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
gridPerguntasJaAssociadas.Columns[3].Width = 100;
gridPerguntasJaAssociadas.Columns[3].DividerWidth = 1;
gridPerguntasJaAssociadas.Columns[3].Visible = true;
gridPerguntasJaAssociadas.Columns.Add([Ô]ID_ATIT_HABIL[Ô], [Ô]ID Atit/Habil[Ô]);
gridPerguntasJaAssociadas.Columns[4].DataPropertyName = [Ô]ID_ATIT_HABIL[Ô];
gridPerguntasJaAssociadas.Columns[4].Visible = false;
gridPerguntasJaAssociadas.Columns.Add([Ô]DESCRICAO_ATIT_HABIL[Ô], [Ô]Item[Ô]);
gridPerguntasJaAssociadas.Columns[5].DataPropertyName = [Ô]DESCRICAO_ATIT_HABIL[Ô];
gridPerguntasJaAssociadas.Columns[5].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
gridPerguntasJaAssociadas.Columns[5].Width = 200;
gridPerguntasJaAssociadas.Columns[5].DividerWidth = 1;
gridPerguntasJaAssociadas.Columns[5].Visible = true;
gridPerguntasJaAssociadas.Columns.Add([Ô]ATITUDEouHABILIDADE[Ô], [Ô]Cod Atit/Habil[Ô]);
gridPerguntasJaAssociadas.Columns[6].DataPropertyName = [Ô]ATITUDEouHABILIDADE[Ô];
gridPerguntasJaAssociadas.Columns[6].Visible = false;
gridPerguntasJaAssociadas.Columns.Add([Ô]IDIOMA[Ô], [Ô]Idiomas[Ô]);
gridPerguntasJaAssociadas.Columns[7].DataPropertyName = [Ô]IDIOMA[Ô];
gridPerguntasJaAssociadas.Columns[7].Visible = false;

[txt-color=#e80000]// Aqui a coluna que incluí[/txt-color]
DataGridViewCheckBoxColumn myCheckedColumn = new DataGridViewCheckBoxColumn();
myCheckedColumn.Name = [Ô]ASSOCIAR[Ô];
myCheckedColumn.HeaderText = [Ô]Excluir[Ô];
myCheckedColumn.FalseValue = 0;
myCheckedColumn.TrueValue = 1;

// add the new column to your dataGridView
gridPerguntasJaAssociadas.Columns.Add(myCheckedColumn);
gridPerguntasJaAssociadas.Columns[8].DividerWidth = 1;
gridPerguntasJaAssociadas.Columns[8].Width = 50;
gridPerguntasJaAssociadas.Columns[8].Visible = true;
gridPerguntasJaAssociadas.Refresh();
}

1) Ao tentar acessar essa coluna, ele diz que o índice 9 é inválido, e se usar 8 traz o valor da coluna IDIOMA e não da coluna ASSOCIAR.

Fiz assim:
private void gridPerguntasJaAssociadas_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
// Este evento é disparado quando o usuário clica no conteúdo de uma célula
//Verificamos se e somente se a celula checkbox (Estado) foi clicada
if (e.ColumnIndex == gridPerguntasJaAssociadas.Columns[[Ô]ASSOCIAR[Ô]].Index)
{
if (gridPerguntasJaAssociadas.Rows[e.RowIndex].Cells[9].Value.ToString() == true.ToString())
{
gridPerguntasJaAssociadas.Rows[e.RowIndex].Cells[9].Value = true; //Forçar mudar o valor
}
else
{
gridPerguntasJaAssociadas.Rows[e.RowIndex].Cells[8].Value = false; //Forçar mudar o valor
}

//exibe os valores da célula quando clicada: verdadeiro (true) ou falso (false)
MessageBox.Show([Ô]=> [Ô] + gridPerguntasJaAssociadas.Rows[e.RowIndex].Cells[8].Value.ToString());
}
}

Na messagebox não exibe o valor da coluna correta (True ou False)

2) Neste mesmo evento acima, tentei fazer a troca da o valor da coluna, ou seja, se o usuário clicar na coluna ele marca ou desmarca o checkbox, mas não funciona.

Nota: O grid está configurado para Selecionar a Linha inteira e não somente uma célula, tem que ser assim. Agora ele também está configurado para não permitir edição no grid, pois o usuário não pode digitar nele, só selecionar UMA ÙNICA LINHA.

O que eu queria é ao clicar na célula dessa linha o valor ser marcado ou desmarcado, mas não estou sabendo como fazer. Tentei usar o
gridPerguntasJaAssociadas.BeginEdit(true);
gridPerguntasJaAssociadas.EndEdit();

mas não consegui.

Alguém pode ajudar?
LUIS.HERRERA 07/08/2013 08:15:56
#427139
Nossa depois de procurar muitos sites, descobri no meio de um código como resolver.

Fiz 3 coisas para funcionar:
1)Troquei a linha abaixo
De: //gridPerguntasJaAssociadas.Columns.Add(myCheckedColumn);
Por: gridPerguntasJaAssociadas.Columns.Insert(8, myCheckedColumn);

Mudei o código do evento
private void gridPerguntasJaAssociadas_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == gridPerguntasJaAssociadas.Columns[[Ô]ASSOCIAR[Ô]].Index)
{
gridPerguntasJaAssociadas.BeginEdit(true);
DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell();
ch1 = (DataGridViewCheckBoxCell)gridPerguntasJaAssociadas.Rows[gridPerguntasJaAssociadas.CurrentRow.Index].Cells[[Ô]ASSOCIAR[Ô]];

if (ch1.Value == null)
ch1.Value = false;
switch (ch1.Value.ToString())
{
case [Ô]True[Ô]:
ch1.Value = false;
break;
case [Ô]False[Ô]:
ch1.Value = true;
break;
}
MessageBox.Show(ch1.Value.ToString());

//interrompe a edição
gridPerguntasJaAssociadas.EndEdit();

}

3) Veja que no código acima fiz várias alterações
- não estou mais acessando a célula pelo índice 8, mas sim pelo seu nome. Não sei porque ele não troca o número.
- Tive de trocar o ADD pelo Insert.
- Usei o BeginEdit e EndEdit para poder trocar o estado do checkbox, já que o grid não pode ser editado.

Bem é isso, espero que possa ajudar alguém a não passar tanto tempo procurando a solução.
Tópico encerrado , respostas não são mais permitidas