CHECKBOX EM DATAGRIDVIEW
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?
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?
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.
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