Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia amigos, estou criando uma tela para liberar permissão de acesso a rotinas de acordo com o perfil do usuário logado. Para tanto, criei uma tela de permissão onde listo todas as rotinas do sistema, trazendo o código, o descritivo da rotina e um checkbox para habilitar/desabilitar acesso num DataGridView. A parte de carregar os dados no grid eu fiz sem problemas, e meu problema reside no passo seguinte.
Gostaria que através do DataGridView o usuário marcasse quais rotinas estão liberadas e, ao salvar, o programa lê-se todas as linhas do grid e linha a linha executasse a gravação dos dados na tabela.... fiz um for para ler baseado no total de linhas do grid e tals, mas por mais que eu altere o valor no grid de true pra false por exemplo, na hora de gravar, o valor que é passado na leitura é o valor carregado do banco... não sei se tem algum esquema para poder editar e capturar o valor do checkbox dentro do DataGridView.... alguém tem alguma dica quanto a isso?
Grato.
Ai que está quintelab.... tentei utilizar a mesma lógica que usaria no Delphi: exibir os dados no datagridview, deixar o usuário marcar/desmarcar o checkbox que já existe no datagridview e depois varrer o mesmo do início ao fim e atualizar no banco linha a linha ... usei o código abaixo pra isso:
private void btnSalvar_Click(object sender, EventArgs e)
{
string message = "Confirma a alteração dos dados?";
string caption = "Atenção";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result;
result = MessageBox.Show(message, caption, buttons, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
try
{
string sNomeProcedure = "AFITACSP022";
string sCodigoRotina;
Boolean bAcessoLiberado;
string[] vsParametros = { "@PsOperacao", "@PnCodigoPerfil", "@PnCodigoRotina", "@PbAcessoLiberado", "@PsLoginUsuario", "@PnErroProcessamento", "@PsMensagemErro" };
for (int iLinha = 0; iLinha < dgRotinasLiberadasPerfil.Rows.Count; iLinha++)
{
sCodigoRotina = Convert.ToString(dgRotinasLiberadasPerfil.Rows[iLinha].Cells["cnCodigoRotina"].Value);
bAcessoLiberado = Convert.ToBoolean(dgRotinasLiberadasPerfil.Rows[iLinha].Cells["cbAcessoLiberado"].Value);
string[] vsValoresEntrada = { "AI", PsCodigoPerfil, sCodigoRotina, bAcessoLiberado.ToString(), "", "", "" };
bool[] vbOutPut = { false, false, false, false, false, true, true };
string[] vsTipoDado = { "C", "L", "L", "B", "V", "T", "V" };
string[,] sRetorno = accDB.Salvar(vsParametros, vsValoresEntrada, vbOutPut, vsTipoDado, sNomeProcedure);
for (int i = 0; i < 2; i++)
{
if (sRetorno[i, 0] == "@PnErroProcessamento")
{
iLinha = dgRotinasLiberadasPerfil.Rows.Count;
}
}
}
AtualizaGrid();
}
catch (Exception ex)
{
MessageBox.Show("Erro " + ex.Message);
}
}
}
O problema é: independente do que é exibido no grid, o que é passado para a rotina de atualização é o valor carrega inicialmente... isto é, se eu carreguei no perfil uma rotina com acesso liberado e cliquei no checkbox para desmarcar, o valor retornado na linha bAcessoLiberado = Convert.ToBoolean(dgRotinasLiberadasPerfil.Rows[iLinha].Cells["cbAcessoLiberado"].Value); continua sendo o valor carregado do banco, não o valor atual do checkbox... então, se a rotina estava bloqueada e eu estou liberando o acesso, ela continua bloqueada, e vice-versa.... alguém sabe o que estou fazendo de errado?
Na web eu consigo localizar o controle, não tenho certeza se o mesmo é possível em windows. Veja se consegue algo do tipo:
CheckBox chk = dgRotinasLiberadasPerfil.Rows[iLinha].Cells["cbAcessoLiberado"].Controls[0] as CheckBox;
Abraços...
Falta de tempo me atrasa -_-''
Mas encontrei onde está o problema... no código que montei inicialmente usei esta linha de código abaixo....
bAcessoLiberado = Convert.ToBoolean(dgRotinasLiberadasPerfil.Rows[iLinha].Cells["cbAcessoLiberado"].Value);
Quando deveria ser assim....
bAcessoLiberado = Convert.ToBoolean(dgRotinasLiberadasPerfil.Rows[iLinha].Cells["cbAcessoLiberado"].EditedFormattedValue);
Problema resolvido.
No projeto windows que tenho aqui, trabalho com uma grid do Dev, mas acredito que a idéia seja a mesma.
for (int i = 0; i < itens.Count; i++)
{
Onde itens é meu DataSource.
Abraços...