2009-03-26 4 views
2

Каков правильный порядок обработки вставки из элемента управления, связанного с данными, с использованием BindingSource, DataSet и TableAdapter? Это вызывает у меня вечную путаницу.Ошибка привязки ADO.NET - BindingSource.EndEdit() изменяет текущую позицию

У меня есть форма, которая используется для добавления новой строки.

Перед показом формы, я называю:

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

После Спасите, я называю:

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

Проблема заключается в том, что

  • , если я не называю EndEdit(), изменения TextBox с текущим фокусом не сохраняются
  • , если я вызываю EndEdit(), текущий член BindingSource больше не указывает на строку, которую я только что добавил.

Я могу, конечно, вызов Insert() со значениями из формы в отличие от DataTable, который был обновлен в BindingSource, но что поражения цели с помощью привязки данных. Что мне нужно сделать, чтобы заставить это работать?

Я понимаю, что я мог бы позвонить TableAdapter.Update() на весь DataSet, так как я использую строго типизированный DataSet. У меня есть внешние ключи в таблице, которые не привязаны к базе данных, и что я добавляю их до того, как я назову Insert().

ответ

3

Оказалось, что это «особенность» рамки .NET. Ранее я сообщал об connect.microsoft.com, но проблема была закрыта как «не исправить». Однако есть workaround.

Я использую следующий C# код для сброса положения в 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; 
     } 
    } 
-1

Вы, наверное, поняли это сейчас, но вам не нужно вызывать метод вставки из настольный адаптер. Просто вызовите метод обновления, и он определит, есть ли какие-либо новые или измененные записи и действуют соответственно.