none
Atualiza DataGrid Entity Framework 5 RRS feed

  • Discussão Geral

  • Boa noite amigos,

    Estou com uma dúvida que está me tomando muito tempo.

    Sou iniciante em WPF e estou trabalhando com EF 5.

    O que preciso fazer:
    Tenho um DataGrid  e uma das colunas é um checkbox, ao clicar nesse checkbox vou atualizar a informação desse campo no banco. (até aqui sem novidades e está funcionando)

    Esse DataGrid está linkado com o source dadosViewSource.

    Após gravar no banco preciso atualizar o meu datagrid, sem o registro já gravado no banco, estou fazendo da seguinte forma.

    dadosViewSource  = contex.dados.local.where(c=> c.campo = false);

    meuDataGrid.Refresh;

    Quando a instrução "meuDataGrid.Refresh" é acionado ocorre uma mensagem de erro mais ou menos assim: o Datagrid não pode ser atualizado enquanto estiver em edição.

    Me ajudem por favor.

    Obrigado pessoal.

    Abraços

    sexta-feira, 22 de março de 2013 01:48

Todas as Respostas

  • Gabriel bom dia

    Em nossa aplicação utilizo SILVERLIGHT mas não utilizamos EF. Não sei se esta sugestão ajudará.
    Tivemos um problema parecido e resolvemos utilizando OBSERVABLE COLLECTION e NotifyPropertyChanged.

    Vou tentar exemplificar:

    Implemente uma classe conforme abaixo.
    Veja que ela implementa INotifyPropertyChanged.

     public class atualizaDataGrid : INotifyPropertyChanged
        {
            public uint _id;
            public uint Id
            {
                get { return _id; }
                set
                {
                    if (value != this._id)
                    {
                        this._id = value;
                        this.NotifyPropertyChanged("Id");
                    }
                }
            }
    
            public string _nome;
            public string Nome
            {
                get { return _nome; }
                set
                {
                    if (value != this._nome)
                    {
                        this._nome = value;
                        this.NotifyPropertyChanged("Nome");
                    }
                }
            }
    
            public string _tipoDocumento;
            public string TipoDocumento
            {
                get { return _tipoDocumento; }
                set
                {
                    if (value != this._tipoDocumento)
                    {
                        this._tipoDocumento = value;
                        this.NotifyPropertyChanged("TipoDocumento");
                    }
                }
            }
    
            public string _numeroDocumento;
            public string NumeroDocumento
            {
                get { return _numeroDocumento; }
                set
                {
                    if (value != this._numeroDocumento)
                    {
                        this._numeroDocumento = value;
                        this.NotifyPropertyChanged("NumeroDocumento");
                    }
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    Agora  no construtor cria uma variável OBSERVABLE COLLECTION:
    Repare que o tipo T implementa a classe acima atualizaDataGrid e .

     ObservableCollection<atualizaDataGrid> _atualizaDataGrid = new ObservableCollection<atualizaDataGrid>();

    Agora faça sua consulta no banco e crie uma nova instância de atualizaDataGrid adicionando na OBSERVABLE COLLECTION cada registro de retorno uma instância de atualizaDataGrid do que você obteve na sua operação de banco:
    if (retorno.Value)
                {
                    foreach (var item in dataTableRetornoConsulta)
                    {
                        _atualizaDataGrid.Add(new atualizaDataGrid()
                        {
                            Id = item.Id,
                            Nome = item.Nome,
                            TipoDocumento = item.DocumentoTipo,
                            NumeroDocumento = item.DocumentoNumero
                        });
                    }
                }

    Por fim, Limpe seu DataGrid e atribua OBSERVABLE COLLECTION a ele:

    meuDataGrid.ItemsSource = null;
    meuDataGrid.ItemsSource = _atualizaDataGrid;

    FUNCIONAMENTO:

    - Você alimenta a Observable que implementa atualizaDataGrid;
    - atualizaDataGrid é monitorado através de INotifyPropertyChanged, que notifica as alterações nas propriedades;
    - Como você alimenta o Source do Grid com a Observable, qquer alteração que ocorrer nela será refletida no grid.

    Espero ter ajudado!
    Abraço


    Eduardo Agostinho Analista Programador - C# Developer


    • Editado EAgostinho sexta-feira, 22 de março de 2013 13:02
    sexta-feira, 22 de março de 2013 13:01