Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
использование BeginInvoke
|
|||
|---|---|---|---|
|
#18+
Есть экземпляр класса Program. Он: 1. подписан на событие, в котором ему приходят новые данные для обработки. Из этих данных он пользовательским методом формирует таблицу, то есть объект типа DataTable. Реализацию метода я не знаю, просто есть у меня что-то типа myDataTable=GetData(Data), а на выходе имею таблицу с данными. 2. создал окно WPF в новом потоке. В этом окне есть датагрид. В этом датагриде надо отображать эту таблицу сразу при приходе события. То есть каждый раз в пункте 1 эта таблица заполняется новыми данными, которые нужно отобразить. Как я пытаюсь сделать. Сделал у Program статическое свойство myDataTable, которое используется для биндинга. Сделал тестовый пример, в котором сам создаю и сам заполняю это статическое свойство-таблицу данными, и он работает, но проблема в том, что для того, чтоб он работал мне приходится весь код, относящийся к заполнению таблицы myDataTable, помещать в поток WPF (вообще, хотелось бы этого избежать, то есть просто перезаписывать ссылку на уже готовую myDataTable) А главная проблема в том, что в реальности даже эта схема не работает, то есть даже если поместить мой формирующий таблицу метод в поток WPF, то тоже ничего не происходит. Код: plaintext 1. 2. 3. 4. Как можно обновлять myDataTable в гриде в таком случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2010, 17:15 |
|
||
|
использование BeginInvoke
|
|||
|---|---|---|---|
|
#18+
надо менять случай. а то тут через опу все придумано. сделай глобальную переменную. потом своим program классов запиши туда свою mydatatable. дальше прибинди эту глобалку к гриду . собственно и все. при изменении глобалки грид перезальет себя данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2010, 17:26 |
|
||
|
использование BeginInvoke
|
|||
|---|---|---|---|
|
#18+
AlexeiKнадо менять случай. а то тут через опу все придумано. сделай глобальную переменную. потом своим program классов запиши туда свою mydatatable. дальше прибинди эту глобалку к гриду . собственно и все. при изменении глобалки грид перезальет себя данными. Случай да, непростой. Архитектуру придумывал не я. Я пишу ДЛЛ, которая подключается другой прогой, и эта другая прога присылает в мой класс Program это событие с новыми данными. UI там вообще не предусмотрено, а я пытаюсь прикрутить. То есть тут только приспасабливаться. Вы под глобальной переменной что подразумеваете? Их же вроде не было в C#? Только члены классов, а главный класс у меня меня один - Program. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2010, 17:53 |
|
||
|
использование BeginInvoke
|
|||
|---|---|---|---|
|
#18+
Сделал я такую штуку, в отдельном классе, а не как было раньше, просто статическое свойство в Program: Код: plaintext 1. 2. 3. 4. Далее код в событии. Для примера я просто заполняю новую таблицу, а потом пытаюсь маршализовать все это дело диспетчеру окна. tblSettings3 - статическое свойство класса Program, тип DataTable. Обработчик события - один из методов Program. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Сам биндинг: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. При этом, если я напишу в биндинге просто this.DataContext = Program. tblSettings3, а в диспетчере оставлю только код создания таблицы, то все работает. То есть пашет только реальное изменение объекта, который был забинден, в диспетчере окна. У меня есть подозрение, что на датагрид надо биндить метод (формирующий таблицу), но может есть ченить попроще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2010, 19:38 |
|
||
|
использование BeginInvoke
|
|||
|---|---|---|---|
|
#18+
testing22, ну тут да. я уж и забыл что у тебя datatable ,там же view биндится. тут придется каждый раз генерить dataview и биндить его . была бы например obs collection то ее просто биндишь на context и все. а для dt нужно генерить view. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2010, 21:06 |
|
||
|
использование BeginInvoke
|
|||
|---|---|---|---|
|
#18+
AlexeiK, супер, спасибо, только вот вопрос - а постоянное формирование датафью при биндинге при изменении таблицы, это сильно будет нагружать комп? По сравнению с если бы было все это дело в obs coll, и биндилось разово? Допускаю, что входная активность будет очень высокой (то есть, несколько таблиц с постоянными изменениями). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2010, 21:40 |
|
||
|
использование BeginInvoke
|
|||
|---|---|---|---|
|
#18+
testing22, ты попробуй и расскажешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2010, 10:35 |
|
||
|
использование BeginInvoke
|
|||
|---|---|---|---|
|
#18+
AlexeiK, попробовал Проблема в том, что из-за архитектуры приложения, я каждый раз получаю новую Datatable. То есть не изменения, а именно новую. И мне все равно приходится делать кучу телодвижений, а именно, каждый раз, каждый приход данных: 1. Из Datatable забирать данные в список: listDataRow = dataTable.Select().ToList(); 2. идти в поток WPF, там вызывать: ObservableCollectionDataRow<DataRow>.Clear(), (кстати, при очистке наверно тоже срабатывает обновление. Можно как-то запретить обновляться при очистке?) 3. затем по-тупому переводить список listDataRow в ObservableCollectionDataRow: listDataRow.ForEach(x => ObservableCollectionDataRow.Add(x)); То есть происходит по-существу то же самое что и с датавью. Хотя, на глазок вроде поменьше загрузка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2010, 18:15 |
|
||
|
|

start [/forum/topic.php?fid=21&fpage=61&tid=1442647]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 115ms |

| 0 / 0 |
