Ошибка привязки данных ADO.NET - BindingSource.EndEdit () меняет текущую позицию - PullRequest
2 голосов
/ 26 марта 2009

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

Ответы [ 2 ]

3 голосов
/ 26 марта 2009

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

Я использую следующий код 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;
        }
    }
0 голосов
/ 21 мая 2010

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

...