private void RemoverInterno(ISaquinho s) { double quantidadeRemanescente = 0; ListViewItem itemListView; if (!saquinhos.Contains(s)) { ISaquinho saquinhoAlternativo = null; // Tentativa de obter algum ISaquinho parecido para remoção hashAgrupamento.TryGetValue(s.IdentificaçãoAgrupável(), out saquinhoAlternativo); if ((saquinhoAlternativo == null) || (quantidadeRemanescente < 0)) throw new Exception("Tentativa de remover um saquinho que não existia na bandeja"); else { quantidadeRemanescente = saquinhoAlternativo.Quantidade - s.Quantidade; s = saquinhoAlternativo; } } itemListView = hashSaquinhoListViewItem[s]; // Atualiza hash items hashAgrupamento.Remove(s.IdentificaçãoAgrupável()); hashListViewItemSaquinho.Remove(itemListView); hashSaquinhoListViewItem.Remove(s); #if DEBUG if (SuspendeLeiaute) throw new Exception("Tentativa de remover um item de listView com o leiatue suspenso. Devido à bug do VS isto causa um dead lock. Bug verificado tambem no VS2005"); #endif itemListView.Remove(); /* Podem existir vários sáquinhos agrupáveis * Vários outros agrupaveis a este talvés não foram adicionados na hash * uma vez que este já estava referenciado nela. * Portanto, deve-se procurar por outro agrupável para ser referenciado. */ saquinhos.Remove(s); string identificação = s.IdentificaçãoAgrupável(); foreach (ISaquinho saquinho in saquinhos) { if (saquinho.IdentificaçãoAgrupável() == identificação) { hashAgrupamento.Add(identificação, (Saquinho) saquinho); break; } } // Atualiza dados da barra de status. totalMercadorias -= s.Quantidade; totalPeso -= s.Quantidade * s.Peso; totalÍndice -= s.Quantidade * s.Mercadoria.ÍndiceArredondado; if (s.Mercadoria.DePeso) totalÍndicePeso -= s.Quantidade * s.Mercadoria.ÍndiceArredondado; else totalÍndicePeça -= s.Quantidade * s.Mercadoria.ÍndiceArredondado; if (cotação != null) totalPreço -= CalcularValor(s); if (quantidadeRemanescente > 0) { ISaquinho novoSaquinho = s.Clone(quantidadeRemanescente); Adicionar(novoSaquinho); } AtualizarEnabledBotõesBarraFerramentas(); }
private ISaquinho SubstituirSaquinho(ISaquinho s, ISaquinho sOuNovo, string chave, ISaquinho agrupável) { hashAgrupamento.Remove(chave); sOuNovo = s.Clone(s.Quantidade + agrupável.Quantidade); hashAgrupamento[chave] = sOuNovo; RemoverInterno(agrupável); return sOuNovo; }
/// <summary> /// Remove vários saquinhos semelhantes ao do parametro e adiciona um que substitui todos. /// </summary> /// <remarks> O saquinhoAtual já deve estar na bandeja </remarks> /// <param name="saquinhoAtual"></param> /// <returns>Saquinhos agrupáveis ao atual, incluíndo o do parametro</returns> private List<Saquinho> AgruparItem(ISaquinho saquinhoAtual) { List<Saquinho> agrupáveisAoSaquinhoAtual; agrupáveisAoSaquinhoAtual = ObterAgrupáveis(saquinhoAtual); // Se for um, tem apenas ele mesmo. if (agrupáveisAoSaquinhoAtual.Count > 1) { double totalQtd = 0; // Retira os saquinhos que serão eliminados da cópia foreach (Entidades.ISaquinho s in agrupáveisAoSaquinhoAtual) { totalQtd += s.Quantidade; RemoverInterno(s); } // Adiciona novo saquinho que é equivalente ao grupo ISaquinho novoSaquinho = saquinhoAtual.Clone(totalQtd); Adicionar(novoSaquinho, false); } return agrupáveisAoSaquinhoAtual; }
/// <summary> /// Deve ser chamado quando o usuário seleciona uma mercadoria na bandeja para alteração de seus dados. /// Os dados no quadro são descatardos, e substituídos pelo saquinho passado em parâmetro. /// O botão deve mudar para "Alterar", e ficar não enabled até que usuário faça alguma mudança. /// </summary> /// <param name="saquinho">A ser alterado</param> public void AlternarParaAlteração(ISaquinho saquinho) { saquinhoAntesAlteração = saquinho.Clone(saquinho.Quantidade); botão.Text = "&Alterar"; /* A mudança do txtReferência irá gerar um evento * de que a referencia foi alterada. * Então é necessário marcar que o controle acabou de ir para o modo alternaddo, * evitando que o quadro volte para o adicionar. */ inícioAlteração = true; /* Alterar os dados requer que o modo de digitação * rápida seja desligado durante a alteração. * -- Júlio, 17/03/2006 */ ModoRápido = false; chkModoRápido.Enabled = false; txtReferência.Txt.Text = saquinho.Mercadoria.Referência; txtPeso.Text = saquinho.Peso.ToString(); txtQuantidade.Text = saquinho.Quantidade.ToString(); lblPeso.Enabled = txtPeso.Enabled = saquinho.Mercadoria.DePeso; ValidarDados(); ação = AçãoEnum.Alterar; inícioAlteração = false; }
private void bandejaAgrupada_AlteraçãoÍndiceSolicitada(Bandeja bandeja, ISaquinho saquinho) { if (!baseInferior.ConferirTravamento()) { ISaquinho saquinhoParaReAdicionar = saquinho.Clone(saquinho.Quantidade); try { EscolherÍndice(saquinhoParaReAdicionar.Mercadoria, ModoJanelaÍndice.MostrarSempre); bandejaAgrupada.Remover(saquinho); } catch { return; } Adicionar(saquinhoParaReAdicionar.Mercadoria, saquinhoParaReAdicionar.Quantidade, ModoJanelaÍndice.NuncaMostrarNãoAlterandoÍndice); } }
private void quadroMercadoria_EventoAlterou(ISaquinho saquinhoOriginal, double novaQtd, double novoPeso) { if (baseInferior.ConferirTravamento()) { MessageBox.Show(ParentForm, "ATENÇÃO\n\nEste documento foi travado e não pode ser alterado.", "Documento travado", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { bandejaAgrupada.Remover(saquinhoOriginal); } catch (OperationCanceledException) { return; } ISaquinho novoSaquinho = saquinhoOriginal.Clone(novaQtd); novoSaquinho.Mercadoria.EsquecerCoeficientePersonalizado(); if (novoSaquinho.Mercadoria.DePeso) novoSaquinho.Mercadoria.Peso = novoPeso; bandejaAgrupada.Adicionar(novoSaquinho); DateTime agora = Entidades.Configuração.DadosGlobais.Instância.HoraDataAtual; try { bandejaHistórico.Adicionar(new SaquinhoHistóricoRelacionado(coleção.Relacionar(novoSaquinho.Mercadoria, novaQtd, novoSaquinho.Mercadoria.ÍndiceArredondado))); } catch (OperaçãoCancelada) { MessageBox.Show( ParentForm, "A operação foi cancelada pelo sistema. Nenhuma alteração foi realizada no banco de dados.", "Relacionamento de mercadoria", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } catch (InvalidAsynchronousStateException) { RecarregarDocumentoInconsistente(); } }