|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspЯ имел ввиду, конкретно, вот такой нюанс. Новая строка в DataGrid существует только в нём. В источнике её нет. Поэтому по источнику не получится определить были изменения или нет. В идеале, мне нужно получить такое поведение. При любом изменении в новой строке DG она сразу должна добавиться в источник. Отдельный диалог для ввода новой строки эту проблему вполне решает. И я по возможности стараюсь именно так и делать. Eld HaspВ данном случае мне надо определить были ли внесены изменения в список, для этого мне надо сравнить список из DG и список в модели. Любое расхождение между списками: разное количество элементов, разная их последовательность, любое изменение в одном из свойств. Для последнего я и переопределил Equals. Если такой подход не верен, то как лучше сделать? Ну, Equals сам по себе описанную задачу не решает, он просто проверяет эквивалентность экземпляров классов. Здесь возникают такие вопросы: 1) Откуда в DG взялся отдельный список? Вы биндите к DG отдельную копию? 2) Если списки различаются - что присходит дальше? 3) Допустим, в списке отображаются фамилия и имя пользователя. В последней строке был Петров Вася. Эту последнюю строку удалили, добавили новую, и снова ввели "Петров" и "Вася". Различия есть? Или нет? 4) Поскольку Equals и GetHashCode зависят от пользовательского ввода, то вполне возможны дублированные записи - т.е. несколько разных элементов списка, которые будут эквивалентны. Что планировалось делать в таком случае? Eld Haspradgridview - посмотрю, что за зверь. А как довести "компонент штатный до своих хотелок" - не знаю. То ли "хотелок" больше чем возможности штатного элемента, то ли мои возможности и умения значительно ниже моих "хотелок" А вы озвучте хотелки. У стандартного грида есть и группировки, можно прикрутить и фильтрацию, и, возможно, некий наименьший общий знаменатель вполне устроит (меня вот он в 90% случаев устраивает). Я лично не работал с телериковским гридом, но в случае с гридом от девэкспресса за его мегафункционал всегда приходилось расплачиваться тяжеловесностью UI - просто на уровне отклика UI. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 14:58 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld Hasp, Мрак. Короче, ты жить богато и с зарплатой хочешь? Тогда дальнейшее твое творчество уже наносит вред развитию программиста. Выкинь xml и этот топик будет не нужен. Удачи! Имхо.Это не кому-то на заказ. Просто появилась возможность (в основном время) заняться освоением WPF и C#. Чтобы не в пустую из головы придумывать задачи, посмотрел, что чуток может помочь в работе. Создаю приложение и учусь на этом. Пока хочу хоть более-менее WPF и C# освоить. До БД пока... токо смотрю в ту сторону. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 15:00 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld HaspОни могут не помещаться все на видимом поле. И пользователь может передвинуть их вверх вниз в зависимости от того, что ему нужно видеть в первую очередь.а) скроллинг б) доп. Колонка и свойство Очередность.Скроллинг - это понятно. Он и так будет. А вот доп. Колонка - зачем это пользователю? Ему просто надо передвинуть строки вверх-вниз. Доп колонка для него лишнее. А при сохранении всё равно это преимущества не даст, так данные (в доп. колонке) всё рано изменились. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 15:04 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspА вот доп. Колонка - зачем это пользователю?ты сам ввел в Модель важное для ТЕБЯ свойство очередность. Разве нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 15:09 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныОтдельный диалог для ввода новой строки эту проблему вполне решает. И я по возможности стараюсь именно так и делать.+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 15:11 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspСоздаю приложение и учусь на этом.делая свой грид но не зная субд? Это уже перекос будет. Как для двоих сразу юзверей сделать программу на xml без субд? Без транзакции? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 15:13 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныEld HaspЯ имел ввиду, конкретно, вот такой нюанс. Новая строка в DataGrid существует только в нём. В источнике её нет. Поэтому по источнику не получится определить были изменения или нет. В идеале, мне нужно получить такое поведение. При любом изменении в новой строке DG она сразу должна добавиться в источник. Отдельный диалог для ввода новой строки эту проблему вполне решает. И я по возможности стараюсь именно так и делать. Да, это одно из решений. Так тоже делал. Но мне кажется, "красивее" и удобнее делать это в DataGrid - если возможно, конечно. Сон Веры ПавловныEld HaspВ данном случае мне надо определить были ли внесены изменения в список, для этого мне надо сравнить список из DG и список в модели. Любое расхождение между списками: разное количество элементов, разная их последовательность, любое изменение в одном из свойств. Для последнего я и переопределил Equals. Если такой подход не верен, то как лучше сделать? Ну, Equals сам по себе описанную задачу не решает, он просто проверяет эквивалентность экземпляров классов. Здесь возникают такие вопросы: 1) Откуда в DG взялся отдельный список? Вы биндите к DG отдельную копию? 2) Если списки различаются - что присходит дальше? 3) Допустим, в списке отображаются фамилия и имя пользователя. В последней строке был Петров Вася. Эту последнюю строку удалили, добавили новую, и снова ввели "Петров" и "Вася". Различия есть? Или нет? 4) Поскольку Equals и GetHashCode зависят от пользовательского ввода, то вполне возможны дублированные записи - т.е. несколько разных элементов списка, которые будут эквивалентны. Что планировалось делать в таком случае? 1) Да - список в DG это копия списка в модели. Сохранить данные из View можно только явно - нажав на кнопку. 2) Если списки различаются, то становится активной кнопка "Сохранить" и пользователь может сохранить данные. Так же при переходе к другому списку (в данном примере этот функционал не реализован) пользователю выводится предупреждение, что он может потерять данные. 3) По алгоритму это будут считаться одинаковыми списками. 4) Они так и будут дублироваться, пользователя в этом не ограничиваю. Возможно, потом, проверю при пробной эксплуатации, сделаю предупреждение об этом, но ограничивать не буду. Сон Веры ПавловныEld Haspradgridview - посмотрю, что за зверь. А как довести "компонент штатный до своих хотелок" - не знаю. То ли "хотелок" больше чем возможности штатного элемента, то ли мои возможности и умения значительно ниже моих "хотелок" А вы озвучте хотелки. У стандартного грида есть и группировки, можно прикрутить и фильтрацию, и, возможно, некий наименьший общий знаменатель вполне устроит (меня вот он в 90% случаев устраивает). 1) При изменении значения любой ячейки сразу (без выхода из фокуса) определить это, чтобы сделать кнопку "Сохранить" активной (это для данного примера, но есть ещё небольшой и другой функционал). 2) При изменении любой ячейки в новой строке, снизу сразу должна появиться другая новая строка. 3) По возможности для решения как можно меньше использовать CB. Первый, пункт я ещё как-то представляю решение с помощью TextBox в ячейке. При фокусе на ячейке сразу перевести TextBox в режим редактирования. Придётся использовать событие TextBox.TextChanged и обработчик присоединять через EventSetter. Но не знаю насколько хорошее такое решение. Второй пункт как сделать не знаю. Нужны подсказки. Хотя бы в какую сторону копать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 15:31 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld HaspА вот доп. Колонка - зачем это пользователю?ты сам ввел в Модель важное для ТЕБЯ свойство очередность. Разве нет?Да, но для этого достаточно, в данном случае, индекса элемента в списке. По нему я и определяю очерёдность. Это нагляднее и удобнее для пользователя. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 15:36 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld HaspСоздаю приложение и учусь на этом.делая свой грид но не зная субд? Это уже перекос будет. Как для двоих сразу юзверей сделать программу на xml без субд? Без транзакции?Пока - да. Освоюсь с WPF буду прикручивать БД. Пока хочу максимально абстрагироваться от способа хранения данных. Чтобы изменив модель можно было ничего другого не трогать. Поэтому и не хочу привязывать DG напрямую к данным. И данная в примере часть, работает только с небольшим списком дополнительных свойств или информации. Есть ещё другие данные большего объёма, там без БД в многопользовательском режиме не обойтись, пока делаю просто пробную однопользовательскую реализацию. Для самообучения. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 15:43 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspПока хочу максимально абстрагироваться от способа хранения данных.не выйдет. При бд весь твой топик и опыт прямиком в мусор. А сейчас, на событие отрисовки ЯЧЕЙКИ подставляй data[row, column] ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 16:19 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123Eld HaspПока хочу максимально абстрагироваться от способа хранения данных.не выйдет. При бд весь твой топик и опыт прямиком в мусор. А сейчас, на событие отрисовки ЯЧЕЙКИ подставляй data[row, column] )))Я то опыт накапливаю сейчас для работы с WPF и C#. Даже если код не пригодится, опыт-то останется. Что касается отрисовки, то такое часто применял при работе с WinForms. Там, по сути, по другому и невозможно. Хотелось бы чего-то другого в WPF. Я всё же склоняюсь к UserControl. Мне кажется это лучшее выглядит для WPF. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 17:18 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspДаже если код не пригодится, опыт-то останется.хороший оксюморон)). Делайте! Вас все равно не свернуть с пути. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 17:42 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspЯ то опыт накапливаю сейчас для работы с WPF и C#. Даже если код не пригодится, опыт-то останется.Делай, не слушай Петю, он, похоже, никогда не учился, сразу родился программистом. Код, написанный два-три года назад, тем более в учебных целях, не пригодится, но опыт будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 17:45 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Shocker.ProEld HaspЯ то опыт накапливаю сейчас для работы с WPF и C#. Даже если код не пригодится, опыт-то останется.Делай, не слушай Петю, он, похоже, никогда не учился, сразу родился программистом. Код, написанный два-три года назад, тем более в учебных целях, не пригодится, но опыт будет.Ну токо с Вашей помощью! Куда ж я без Вас! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 17:56 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
DG пофигу на транзакции, это обычный элемент управления и к таблицам БД он имеет посредственное отношение , которое заключается в том, что он поддерживает DataTable класс. Лично я, по возможности, использую всегда DataGrid, ведь с помощью шаблонов я могу выкинуть из него всё, что хочу. Есть еще вариант ListView, он более легковесный. В DG всё готово, добавление\редактирование\горизонтальная виртуализация, сортировка и бери и пользуйся, но не без проблем конечно. При использовании команд, состояние кнопки IsEnabled зависит от выполнения метода CanExecute, по этому у вас кнопка и не включается. Для того, чтоб кнопка обновила статус, нужно вручную вызвать метод CommandManager.InvalidateRequerySuggested() если обновление кнопки подписывается на этот вызов, см. пример ниже Код: c# 1. 2. 3. 4. 5.
или возбудить внутреннее событие кнопки CanExecuteChanged, с её обычной реализацией Код: c# 1.
В первом случае учтите, что при таком подходе, вызов метода InvalidateRequerySuggested приведет к проверке всех команд которые подписаны на CommandManager.RequerySuggested. По этому, CanExecute должен быть максимально быстрой операцией. Можно сделать, проще и дёргать событие ICommand.CanExecuteChanged вручную, либо отслеживать изменение свойств заданной модели представления через INPC внутри команды и возбуждать событие как это сделано во всякие MVVMLight и прочем. Так же в биндинге источник обновляется по триггеру, который по умолчанию в 99% случаев задан как обновление при потере фокуса, но можно поменять на немедленное обновление. "{Binding UpdateSourceTrigger=PropertyChanged}" В примере есть 2 кнопки, настроенные на разные команды, но выполняющие одни и те же методы. У 1 кнопки состояние обновляется, а у второй кнопки нет. Код: 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. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:01 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Но в целом у меня от WPF впечатление какой-то сыроватости. Вроде, как хорошее начало, идеи, но начинаешь делать то того не хватает, то то как-то по кривому делать приходится, то сложности на пустом месте - какая-то мелочь в сотню строк обходится и т.д. Ни как не пойму это у меня такое впечатление от нехватки знаний, или оно так и есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:01 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Shocker.ProДелай, не слушай Петюдетский сад пенсионера не любящего модальных окон) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:36 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Roman MejtesDG пофигу на транзакции, это обычный элемент управления и к таблицам БД он имеет посредственное отношение , которое заключается в том, что он поддерживает DataTable класс.Мне где-то попадалась (не могу найти сейчас) статья о том, как DG вносит изменения в источник. И там было объяснено, что у DG есть какое-то внутреннее представление или буфер для данных. И изменения происходят там. По умолчанию данные скидываются в источник при выходе (потере фокуса) из строки. Можно изменить на скидывание по выходу из ячейки. С новой строкой - только по выходу из строки. Я не помню как точно - но там было название этого механизма. И транзакцией я его назвал не правильно, просто не смог найти правильного названия. Roman MejtesЛично я, по возможности, использую всегда DataGrid, ведь с помощью шаблонов я могу выкинуть из него всё, что хочу. Есть еще вариант ListView, он более легковесный. В DG всё готово, добавление\редактирование\горизонтальная виртуализация, сортировка и бери и пользуйся, но не без проблем конечно.Ага...! То что для Вас "не без проблем" это для меня два дня копания в инете и несколько десятков пробных вариантов. Roman MejtesПри использовании команд, состояние кнопки IsEnabled зависит от выполнения метода CanExecute, по этому у вас кнопка и не включается. Для того, чтоб кнопка обновила статус, нужно вручную вызвать метод CommandManager.InvalidateRequerySuggested() если обновление кнопки подписывается на этот вызовКнопка у меня включается нормально. Повесил привязку на Button.IsEnabled к свойству VM показывающему о наличии/отсутствии изменений. Это свойство в любом случае у меня есть в VM, так как нужно ещё для другого функционала кроме кнопки. Я этот кусок делал ещё то того как начал знакомится с командами - использовал события. После Вашей помощи начал переделывать. А CanExecute - я просто забыл переделать. Было свойство и я на автомате прибиндил к нему Button.IsEnabled. Для чистоты, раз использую команды, конечно надо переделать. Вы безусловно правы.Roman MejtesТак же в биндинге источник обновляется по триггеру, который по умолчанию в 99% случаев задан как обновление при потере фокуса, но можно поменять на немедленное обновление. "{Binding UpdateSourceTrigger=PropertyChanged}" Я знаю об этом триггере, у меня в примере он установлен. Но для "поимки" изменения в источнике, в данном случае это элемент списка, придётся ловить его в самом элементе и потом "проталкивать" до VM - объявить событие в классе элемента и подписать на него VM. А для новой строчки даже это не поможет. Так как новая строчка существует только "внутри" DataGrid. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:39 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspНи как не пойму это у меня такое впечатление от нехватки знаний, или оно так и есть?есть такое, и пусть Shocker.Pro прыгает от злости. Это эксперимент MS и он всегда может от него отказаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:40 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123детский сад пенсионера не любящего модальных окон)Да я моложе вас всех вместе взятых! (С) От модальных окон я отказался по простой причине. Представь, что есть приложение, не хелловорлд, в нем запущено несколько окон на вкладках, к примеру журнал заказов, несколько заказов, карточка клиента и т.п. И одна из этих вкладок вызвала некий диалог. А юзеру чтобы корректно заполнить этот диалог необходимо заглянуть в другое окно, скажем, в журнал доставок. Или звонит клиент, нужно срочно пообщаться с ним по его заказу, а у тебя открыт модальный наполовину заполненный диалог. Так что модальность мешает и очень сильно. Диалог должен блокировать только тот компонент программы, из которого он вызван, а не все приложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:42 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Petro123есть такое, и пусть Shocker.Pro прыгает от злости. Это эксперимент MS и он всегда может от него отказаться.Есть мнение, что WPF закончен к версии 4.0. В 4.5 были лишь косметические изменения, по сравнению с предыдущими версиями. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:44 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld HaspМне где-то попадалась (не могу найти сейчас) статья о том, как DG вносит изменения в источник. И там было объяснено, что у DG есть какое-то внутреннее представление или буфер для данных. И изменения происходят там. По умолчанию данные скидываются в источник при выходе (потере фокуса) из строки. Можно изменить на скидывание по выходу из ячейки. С новой строкой - только по выходу из строки. Я не помню как точно - но там было название этого механизма. И транзакцией я его назвал не правильно, просто не смог найти правильного названия.это наверно dataSet. Но тут WPF уже по другому. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:46 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Eld Hasp, это не буфер, а так называемое представление коллекции (ICollectionView) для списочных типов используется ListCollectionView, именно там реализован интерфейс IEditableCollectionViewAddNewItem добавление элементов в источник. Который и поддерживается в DataGrid. Для любой коллекции в рамках потока существует представление коллекции по умолчанию, через которое работает DataGrid, если источником является класс наследующий IEnumerable, но если создать собственный экземпляр представления и связать его с ItemSource, то будет использоваться именно он. Представление коллекции так же реализует сортировку, фильтрацию списка, синхронизацию текущего элемента, навигацию и другой функционал. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:51 |
|
Отслеживание изменений в DataGrid
|
|||
---|---|---|---|
#18+
Roman MejtesEld Hasp, это не буфер, а так называемое представление коллекции (ICollectionView) для списочных типов используется ListCollectionView, именно там реализован интерфейс IEditableCollectionViewAddNewItem добавление элементов в источник. Который и поддерживается в DataGrid. Для любой коллекции в рамках потока существует представление коллекции по умолчанию, через которое работает DataGrid, если источником является класс наследующий IEnumerable, но если создать собственный экземпляр представления и связать его с ItemSource, то будет использоваться именно он. Представление коллекции так же реализует сортировку, фильтрацию списка, синхронизацию текущего элемента, навигацию и другой функционал.Так как "выловить" изменение ячейки до выхода из неё? И как быть с новой строкой? Можно ли сделать что-то с этим? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2018, 18:58 |
|
|
start [/forum/topic.php?fid=21&msg=39728788&tid=1440380]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
143ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 267ms |
0 / 0 |