Eu tenho um aplicativo winforms e quero acionar algum código quando uma caixa de seleção incorporada em um DataGridView
controle é marcada / desmarcada. Cada evento que tentei também
- Aciona assim que
CheckBox
é clicado, mas antes que seu estado de seleção mude, ou - Aciona apenas quando
CheckBox
perde o foco
Não consigo encontrar o evento que dispara imediatamente após as mudanças de estado verificado.
Editar:
O que estou tentando alcançar é que, quando o estado verificado de um CheckBox
em um DataGridView
muda, os dados em dois outros DataGridView
mudam. Mesmo assim, todos os eventos que usei, os dados nas outras grades só mudam depois que CheckBox
o primeiro DataGridView
perde o foco.
c#
winforms
datagridview
PJW
fonte
fonte
CurrentCellDirtyStateChanged
evento?Respostas:
Para manipular o evento
DatGridView
sCheckedChanged
, você deve primeiro fazer oCellContentClick
disparar (que não tem oCheckBox
estado atual es!) E depois chamarCommitEdit
. Isso, por sua vez, disparará oCellValueChanged
evento que você pode usar para fazer seu trabalho. Este é um descuido da Microsoft . Faça algo como o seguinte ...Eu espero que isso ajude.
PS Verifique este artigo https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.currentcelldirtystatechanged(v=vs.110).aspx
fonte
DataGridViewCheckBox
. Isso não é WPF e clicar duas vezes no controle não interrompe a vinculação de dados, é WinForms. Clicar duas vezes pode não atualizar o controle visualmente, mas não quebra nada e, neste caso, talvez a solução abaixo seja a melhor. Obrigado.CellContentClick
emCellContentDoubleClick
também.CellMouseUp
Isso será disparado mesmo se a célula estiver selecionada, mas a caixa de seleção não for marcada - o que não é o comportamento desejado.Descobri que a solução do @ Killercam funcionava, mas era um pouco duvidosa se o usuário clicasse duas vezes rápido demais. Não tenho certeza se outro descobriu que o caso também. Eu encontrei outra solução aqui .
Ele usa o datagrid's
CellValueChanged
eCellMouseUp
. Changhong explica queAqui está ele em ação a partir de seu exemplo:
E o código para dizer à caixa de seleção que a edição foi concluída quando ela foi clicada, em vez de esperar até que o usuário deixasse o campo:
fonte
KeyPreview
como true no formulário e quandoe.KeyCode == Keys.Space
, configureie.Handled = true
. Em outras palavras, acabei de desabilitar a edição do teclado.A solução de jsturtevants funcionou muito bem. Porém, optei por fazer o processamento no evento EndEdit. Prefiro essa abordagem (em meu aplicativo) porque, ao contrário do evento CellValueChanged, o evento EndEdit não dispara enquanto você preenche a grade.
Aqui está meu código (parte do qual foi roubado de jsturtevant:
fonte
CellContentClick
vez deCellMouseUp
porque o último será chamado quando o usuário clicar em qualquer lugar dentro da célula, enquanto o primeiro só é chamado quando a caixa de seleção é clicada.Isso também controla a ativação do teclado.
fonte
Aqui está um código:
fonte
CommitEdit
deCurrentCellDirtyStateChanged
é toda a solução.seguindo Killercam'answer, Meu código
e:
fonte
É tudo sobre a edição da célula, o problema é que a célula não foi editada na verdade, então você precisa salvar as alterações da célula ou da linha para obter o evento quando clicar na caixa de seleção para poder usar esta função:
com isso você pode usá-lo até mesmo com um evento diferente.
fonte
Encontrei uma resposta mais simples para esse problema. Eu simplesmente uso a lógica reversa. O código está em VB, mas não é muito diferente do C #.
Uma das melhores coisas sobre isso é a não necessidade de vários eventos.
fonte
O que funcionou para mim foi
CurrentCellDirtyStateChanged
em combinação comdatagridView1.EndEdit()
fonte
O código fará um loop em DataGridView e verificará se a coluna CheckBox está marcada
fonte
No evento CellContentClick você pode usar esta estratégia:
fonte
Tentei algumas respostas daqui, mas sempre tive algum tipo de problema (como clicar duas vezes ou usar o teclado). Então, combinei alguns deles e consegui um comportamento consistente (não é perfeito, mas funciona bem).
fonte
Para fazer isso ao usar o xtragrid devexpress, é necessário lidar com o evento EditValueChanged de um item de repositório correspondente, conforme descrito aqui . Também é importante chamar o método gridView1.PostEditor () para garantir que o valor alterado foi postado. Aqui está uma implementação:
Observe que, como o xtragrid não fornece um enumerador, é necessário usar um loop for para iterar nas linhas.
fonte
Remover o foco após as alterações do valor da célula permite que os valores sejam atualizados no DataGridView. Remova o foco definindo CurrentCell como null.
fonte
Você pode forçar a célula a confirmar o valor assim que clicar na caixa de seleção e capturar o evento CellValueChanged . O CurrentCellDirtyStateChanged dispara assim que você clica na caixa de seleção.
O código a seguir funciona para mim:
Você pode então inserir seu código no evento CellValueChanged .
fonte
Ben Voigt encontrou a melhor solução em um comentário-resposta acima:
Sério, isso é tudo que você precisa.
fonte