Ошибка привязки данных ADO.NET — BindingSource.EndEdit() изменяет текущую позицию

Каков правильный порядок обработки вставки из элемента управления с привязкой к данным с использованием BindingSource, DataSet и TableAdapter? Это вызывает у меня вечную путаницу.

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

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

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() для всего набора данных, поскольку я использую строго типизированный набор данных. Однако у меня есть внешние ключи в таблице, которые не привязаны к базе данных, и я добавляю их перед вызовом Insert().


person cdonner    schedule 26.03.2009    source источник


Ответы (2)


Оказывается, это «функция» фреймворка .NET. Ранее обо мне сообщали на connect.microsoft.com, но вопрос был закрыт как "не исправит". Однако существует обходной путь.

Я использую следующий код С# для сброса позиции в обработчике событий 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;
        }
    }
person cdonner    schedule 26.03.2009

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

person Carla Hepker    schedule 21.05.2010