ADO.NET bug databinding - BindingSource.EndEdit () muda de posição atual
-
22-08-2019 - |
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 ().
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.