Pergunta

O que é a ordem correcta de processamento de uma inserção de um controlo de dados-ligada usando BindingSource , DataSet e TableAdapter ? Esta é fazendo-me confusão eterna.

Eu tenho um formulário que é usado para adicionar uma nova linha.

Antes de mostrar a forma, eu chamo:

bindingSource.AddNew();
bindingSource.MoveLast();

Ao salvar, eu chamo:

bindingSource.EndEdit();
tableAdapter.Insert([the row given to me as bindingSource.Current]);

O problema é que

  • se eu não chamar EndEdit(), as mudanças da caixa de texto com o foco atual não são salvos
  • se eu fizer EndEdit() chamada, membro atual do BindingSource não aponta mais para a linha que eu adicionei.

Eu não posso de Insert() chamada curso com os valores da forma em oposição à tabela de dados que foi atualizado pela BindingSource, mas isso vai contra o propósito de utilizar a ligação de dados. O que eu preciso fazer para começar este trabalho?

Eu entendo que eu poderia chamar TableAdapter.Update() em todo o DataSet, desde que eu estou usando um rigidez DataSet. Eu tenho as chaves estrangeiras na tabela que não são datab-bound, porém, e que estou adicionando em antes que eu chame Insert ().

Foi útil?

Solução

Acontece que este é um 'recurso' do quadro .NET . I foi previamente relatada na connect.microsoft.com , mas a questão foi fechada como "não corrigir". Há um solução , no entanto.

Eu estou usando o seguinte código C # para repor a posição em um manipulador de eventos ListChanged:

    [...]
        bindingSource.ListChanged += 
            new ListChangedEventHandler(PreserveCurrentPosition);
    [...]


    private void PreserveCurrentPosition(object sender, ListChangedEventArgs e)
    {
        if (e.ListChangedType == System.ComponentModel.ListChangedType.ItemAdded &&
            ((BindingSource)sender).Count - e.NewIndex > 1)
        {
            ((BindingSource)sender).Position = e.NewIndex;
        }
    }

Outras dicas

Você provavelmente já descobriram isso até agora, mas você não precisa chamar o método de inserção do adaptador de mesa. Basta ligar para o método de atualização, e que vai determinar se há quaisquer registros novos ou alterados e agir em conformidade.

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