Pergunta

Eu acho que é um problema bastante comum nos cenários de banco de dados. O que você costuma fazer, se estiver executando uma atualização em lote e deseja evitar que um cálculos/ações/ações/ações de dependência de propriedades da propriedade sejam executadas para cada atualização?

A primeira coisa que geralmente me vem à mente é introduzir um novo booleano ou solucionar/conectar o manipulador de eventos, ...

O que eu não gosto nessa abordagem é:

  • Eles introduzem nova complexidade (deve ser mantida, ...)
  • Eles são propensos a erros, porque você precisa garantir que as notificações suprimidas sejam enviadas depois

Estou me perguntando se alguém já abordou esse problema de uma maneira mais conveniente que é mais fácil de lidar?

Tia Martin

EDIT: Não me entende. Eu sei sobre as coisas .NET fornece como RaiselistChangEdevents da BindingList, ... todos estão abordando o problema de maneira mais/menos da mesma maneira que descrevi, mas estou procurando uma maneira diferente que não precise listar desvantagens . Talvez eu esteja na faixa errada, mas eu penso que tentar aqui ...

Foi útil?

Solução

Infelizmente, não há uma única solução de tamanho único. Eu apliquei ou vi as seguintes soluções:

  1. Existem dois cantores. Um sinal é emitido quando a alteração vem de uma ação do usuário, o outro sempre dispara. Isso permite distinguir entre alterações na interface do usuário e atualizações por código.

  2. Um booleano para proteger o código

  3. A estrutura de eventos da propriedade para de propagar eventos automaticamente quando um valor não mudou.

  4. Um método de congelamento/degelo no sinal ou no gerente de sinal (ou seja, toda a estrutura)

  5. Uma maneira de mesclar sinais em um único. Você pode fazer n atualizações e elas são coletadas em s sinais em que M <= N. se você alterar a mesma propriedade 100 vezes, ainda obterá apenas 1 sinal.

  6. Fila de sinais (em vez de execução síncrona). O código de filas também pode mesclar sinais. Eu usei isso com grande sucesso em um aplicativo que não possui um botão "salvar". Todas as alterações são salvas no banco de dados à medida que você as faz. Quando você altera um texto, as alterações são mescladas ao longo de um certo tempo (a saber, até que a atualização anterior do banco de dados retorne) e, em seguida, elas são comprometidas como uma única alteração.

  7. Uma API para definir vários valores de uma só vez; Apenas um único sinal é emitido.

  8. A estrutura de sinal pode enviar sinais em diferentes níveis de granularidade. Digamos que você tenha uma pessoa com um nome. Quando você muda o nome, você recebe dois sinais: um para a mudança de nome e um "campo de instância alterado". Portanto, se você se importa apenas "tem algo alterado", poderá conectar -se à instância em vez de todos os campos.

Outras dicas

Qual plataforma? O post me faz pensar .NET.

Quais são os objetos subjacentes? Por exemplo, BindingList<T> Como fonte permite desativar as notificações definindo RaiseListChangedEvents False ao fazer a atualização.

Fora isso (ou similar); Sim, desconecte a ligação durante grandes atualizações

O caminho mais fácil a seguir é usar o BindingSource componente para sua ligação de dados. Em vez de vincular seus controles a um determinado objeto (ou ilista), use esse objeto como o DataSource para o BindingSource, depois vincule os controles ao BindingSource.

o BindingSource A classe tem SuspendBinding() e ResumeBinding() funções.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top