|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
Добрый день, Создал тестовую форму. Поместил на нее DataGridView и ToolStrip с кнопкой "Save" Код формы ниже. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
По умолчанию редактируемая строка грида возвращается в исходное состояние, если будет нажат ESC. В тестовой форме, в общем-то, поведение по умолчанию воспроизводится. Но не всегда. Следующая последовательность действий определяет понятное мне поведение грида, а именно: - перейти на какую-либо запись, сделав ее текущей - внести новое значение в целевую ячейку, например, "aaa" - нажать на кнопку "Save"(запись будет сохранена как в источнике данных, так и на сервере) - перейти на другую запись, сделав ее текущей - внести новое значение в целевую ячейку, например, "sss" - перейти на другую ячейку, не меняя текущей строки - нажать ESC. В результате нажатия значение в целевой ячейке сбросится с "sss" на исходное "aaa" Если выполнять описанную последовательность многократно, то все будет работать так, как я описал. Главное, каждый раз после сохранения записи сменить текущую запись, тогда вопросов нет. Следующая последовательность действий вызывает у меня вопросы, а именно: - перейти на какую-либо запись, сделав ее текущей - внести новое значение в целевую ячейку, например, "aaa" - нажать на кнопку "Save"(запись будет сохранена как в источнике данных, так и на сервере) - не меняя текущей строки изменить значение в текущей ячейке на "sss" - перейти на другую ячейку, не меняя текущей строки - нажать ESC. В этот момент я ожидаю, что значение в ячейке вернется к исходному "aaa", однако, на самом деле, сколько бы раз я не жал ESC, значение в ячейке не изменится, оставаясь равным "sss". По непонятной мне причине значение свойства Row.State на шаге выделенном красным изменится с Unchanged на Modified. Собственно вопрос - почему? И самое главное, как избежать этого? Мне нужно продуцировать поведение по умолчанию, когда при нажатии ESC строка будет приведена в исходное состояние. Буду благодарен за комментарии. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.04.2015, 12:20 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
строка dr.AcceptChanges(); избыточна Но это ничего не меняет. Проблема существует. Были подобные обсуждения или нет? Я ничего не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 01:41 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
Жаль, что нет диалога. По идее не я один должен был в это упереться. Может сохранение записи при работе с DataGridView лучше организовать по другому? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 11:41 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
Вакшуль СергейПо непонятной мне причине значение свойства Row.State на шаге выделенном красным изменится с Unchanged на Modified.А чего тут непонятного? Изменили значение в ячейке - изменилась строка. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 12:38 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
skyANAА чего тут непонятного? Изменили значение в ячейке - изменилась строка. ну смотрите. (пишу по памяти, Visual Studio сейчас перед глазами нет) Перед началом редактирования строки: dr.RowState = Unchanged dr.HasVersion(DataRowVersion.Proposed) = false вносим изменение в ячейку, но не покидаем ее. Ячейка в состоянии редактирования, состояние строки то же: dr.RowState = Unchanged dr.HasVersion(DataRowVersion.Proposed) = false зафиксируем изменения в ячейке: dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) получаем: dr.RowState = Unchanged dr.HasVersion(DataRowVersion.Proposed) = true фиксируем изменения в строке: bs.EndEdit() получаем: dr.RowState = Modified dr.HasVersion(DataRowVersion.Proposed) = false отсылаем изменения на сервер: da.Update(dt); получаем: dr.RowState = Unchanged dr.HasVersion(DataRowVersion.Proposed) = false Дальше не сходя с той же строки и не покидая ячейку(хотя ячейку можно и покинуть, это не повлияет. Главное не менять текущую строку), снова вносим изменения в ячейку. Если не прекращая редактирование ячейки опросить состояния, получим: dr.RowState = Unchanged dr.HasVersion(DataRowVersion.Proposed) = false А теперь самое главное - перенесем мышкой фокус на соседнюю ячейку, не меняя текущей строки . Получим: dr.RowState = Modified а ожидаемые значения должны быть те, что и раньше в аналогичной ситуации(выделены голубым): dr.RowState = Unchanged dr.HasVersion(DataRowVersion.Proposed) = true skyANAА чего тут непонятного? Изменили значение в ячейке - изменилась строка. Состояние строки изменилось с Unchanged на Modified. Разве это нормально? Если перед этим не выполнять сохранение кнопкой Save, то в аналогичной ситуации(при завершении редактирования одной ячейки и переходе к другой ячейки той же строки) состояние строки не будет меняться и останется Unchanged. Если перед этим все-таки выполнить сохранение кнопкой Save, но после сохранения сменить текущую строку, а потом к ней снова вернуться и повторить действие, выделенное жирным шрифтом, то состояние строки также не будет меняться и останется Unchanged. А вы говорите, что ж тут непонятного. Непонятно. Самое главное, я пока не знаю, как избежать этого. Строка не должна неконтролируемо менять состояние на Modified, иначе имеет место ситуация, когда ESC-ом невозможно откатить внесенные пользователем изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 13:41 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
Вакшуль Сергей, а кнопка Save у Вас на ToolStrip-е и следовательно клик по ней не приводит к возникновению событий Validating/Validate в текущей ячейке. Разместите кнопку в другом месте и поведение наверняка изменится. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 14:21 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
skyANA, Мне то, нужно, чтобы клик был по ToolStrip(возможно потом будет и контекстное меню) Кстати, если не ошибаюсь, то при попытке дотянутся и кликнуть по кнопке, лежащей не на ToolStrip, а на форме, то еще до того как запуститься обработчик события кнопки, грид запустит механизм сохранения записи, т.к. фокус должен уйти на кнопку. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 14:47 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
Вакшуль Сергей, ToolStrip (MenuStrip) не забирают фокус и не вызывают Validating/Validate. Сделано это специально. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 14:58 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
skyANAВакшуль Сергей, ToolStrip (MenuStrip) не забирают фокус и не вызывают Validating/Validate. Сделано это специально. да, так и есть. Поэтому нужно написать свой код на этот случай, что я и делаю. Уперся в проблему. Вот думаю, как решить. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 15:03 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
Вакшуль Сергей, дак может таки фокус забирать при сохранении? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 17:27 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
skyANA, в принципе можно попробовать. Только в этом случае нужно будет заботиться чтобы было куда его переносить, и чтобы это было универсально. Просто мне не хотелось бы городить огород. Ведь тут по идее уже все должно быть отработано. Думал, может кто поделится опытом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 18:01 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
Вакшуль Сергей, воспользоваться InvokeLostFocus? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 18:21 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
skyANA, я пробовал. Но это ничего не дает. Само событие можно возбудить, и если на него есть подписчики, они получат уведомление. Но не более того. Последующих событий Validating/Validate не произойдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2015, 18:27 |
|
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
|
|||
---|---|---|---|
#18+
Вакшуль Сергей, решение подсказали тут: https://social.msdn.microsoft.com/Forums/windows/en-US/976c4544-320c-4d7b-bc32-3b3474925f3f/something-caused-rowstate-change-from-unchanged-to-modified?forum=winformsdatacontrols ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2015, 11:05 |
|
|
start [/forum/topic.php?fid=20&msg=38941865&tid=1401634]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 132ms |
0 / 0 |