Я пытаюсь отладить проблему с приложением WinForm.
Приложение использует DataGridView, связанный с DataSet.
Пользователь может выбрать строку и нажать «Изменить», и появится форма редактирования, чтобы пользователь мог редактировать строку и сохранить свои изменения.
Если DataGridView сортируется по одному или нескольким столбцам, и пользователь редактирует строку более одного раза и изменяет положение этих строк в DataGrid (путем изменения одного из отсортированных столбцов ДВАЖДЫ), DataGridView выходит из синхронизации, и я получаю Ошибки исключения.
Вот как код написан:
Когда пользователь щелкает строку и нажимает кнопку редактирования (пользователь может выбрать только одну строку), эта строка передается в EditFom. Форма редактирования создает пустой набор данных и загружает эту строку. Когда пользователь закончил, вызывающая форма использует DataSet.Merge для объединения этих изменений обратно в свой DataSet.
Вот несколько сценариев, которые говорят мне, что это имеет отношение к «слиянию» и сортировке:
(Обратите внимание, я никогда не меняю фактическую «сортировку», я говорю об изменении значения одного из отсортированных по столбцам в одной из строк.)
Если пользователь редактирует строку непосредственно в сетке и изменяет значение одного из столбцов, используемых для сортировки, затем изменяет его снова и т. Д. Строка перемещается по сетке, как и должно быть, и когда пользователь нажимает сохранить, все сохраняет нормально.
Если пользователь редактирует строку (непосредственно в таблице ИЛИ через «шаблон») и не изменяет ни один из столбцов «сортировки», просто выполняет редактирование (тем самым устанавливая «Состояние» строки на Изменено, верно ...), ТОГДА пользователь редактирует строку, используя Шаблон (который проходит через отдельный DataSet и объединяет данные, когда это сделано), и изменяет один из сортируемых столбцов (когда это сделано, сетка должна прибегнуть и строка должна «переместиться»), строка не будет перекрашена, она останется в той же позиции в сетке, в которой она находилась до редактирования шаблона. (Хотя данные сохраняются нормально, и вы можете обновить сетку, и она сортируется должным образом.) Очевидно, DataGrid не уведомляется о том, что RowChanged в этом сценарии (или это так, но он ничего не делает с этим).
Если пользователь редактирует строку непосредственно в таблице, изменяет столбец сортировки (строка перемещается), затем редактирует строку с использованием шаблона и снова изменяет этот столбец, мы получаем те же результаты, что и 2, выше. Данные сохраняются нормально, но когда пользователь покидает шаблон редактирования, сетка не прибегает.
(Это тот, который вызывает ошибку исключения.)
- Если пользователь редактирует строку с использованием шаблона, изменяет столбец сортировки и оставляет шаблон, сетка данных восстанавливается, и строка перемещается правильно. Затем, если пользователь редактирует одну и ту же строку, используя Template Edit, и изменяет столбец сортировки снова. Когда пользователь покидает шаблон редактирования, сетка данных не прибегает, а когда пользователь сохраняет данные и обновляет сетку, мы получаем ошибку:
System.InvalidOperationException: внутренний индекс DataTable поврежден: '5'.
И иногда мы получаем сообщение об отсутствии первичного ключа.
Какой-нибудь совет, как "отладить" это? Я чувствую, что это как-то связано с набором данных internediate, который использует шаблон редактирования, и слиянием. Как будто источник данных DataGrid не синхронизируется со строками DataGrid.