Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с перебором данных мастер-деталь, Связать TreeView с 3-мя DataTable 
V
    Опции темы
barulya
Дата 13.11.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



Доброго времени суток!
У меня имеется три набора данных связанных по связи мастер-деталь последовательно: организации-объекты-здания, соответствующие таблицы данных связаны по определенным ключевым полям.
Данные из этих таблиц размещены в контроле, унаследованном от TreeView согласно их уровню в иерархической структуре. Для связи контролов и данных созданы три bindingsource (назовем их условно А, Б и В) для каждой таблицы данных. Так вот при построении дерева курсор в А установлен на первой записи, в Б и В данные отфильтрованы в соответствии с таблицей А. Если начать перебирать все записи в табл. А и во вложенных циклах данные табл Б и В то, в связи с тем, что А, Б и В связаны с другими контролами, заметно увеличиватся время добавления ветвей дерева.
Подскажите пожалуйста, как отключить контролы от bindingsource для ускорения заполнения дерева? Или может быть можно перебрать строки подчиненных таблиц не меняя позиции соответствующих мастер таблиц.
Вот код, при помощи которого я строю дерево:
Код

    Public Sub BuildStructure()
        Dim intOrgID, intObjID, intBrID As Integer
        Dim rwOrg, rwObj, rwBR As Object
        Dim i, j, k As Integer
        Dim strOrgName, strObjName, strBRName As String
        Dim pdOrgPDColl, pdObjPDColl, pdBRPDColl As System.ComponentModel.PropertyDescriptorCollection
        Dim newORG, newOBJ, newBR As TreeNode
        Me.BeginUpdate()
        Me.Nodes.Clear()
         pdOrgPDColl = _bsorgcm.GetItemProperties()
        pdObjPDColl = _bsobjcm.GetItemProperties()
        pdBRPDColl = _bsbrcm.GetItemProperties()

        For i = 0 To _bsorgcm.Count - 1
            _bsorgcm.Position = i
            rwOrg = _bsorgcm.Current
            intOrgID = CType(pdOrgPDColl(_strorgvm).GetValue(rwOrg), Integer)
            strOrgName = CType(pdOrgPDColl(_strorgdm).GetValue(rwOrg), String)
            newORG = New Organization(intOrgID, strOrgName)
            If Not _orgs.ContainsKey("org" & intOrgID) Then _orgs.Add("org" & intOrgID, newORG)
            Me.Nodes.Add(newORG)
            For j = 0 To _bsobjcm.Count - 1
                _bsobjcm.Position = j
                rwObj = _bsobjcm.Current
                intOrgID = CType(pdObjPDColl(_strobjpm).GetValue(rwObj), Integer)
                intObjID = CType(pdObjPDColl(_strobjvm).GetValue(rwObj), Integer)
                strObjName = CType(pdObjPDColl(_strobjdm).GetValue(rwObj), String)
                newOBJ = New OrgObj(newORG, intObjID, strObjName)
                If Not _orgs.ContainsKey("obj" & intObjID) Then _orgs.Add("obj" & intObjID, newOBJ)
                newORG.Nodes.Add(newOBJ)
                For k = 0 To _bsbrcm.Count - 1
                    _bsbrcm.Position = k
                    rwBR = _bsbrcm.Current
                    intObjID = CType(pdBRPDColl(_strbrpm).GetValue(rwBR), Integer)
                    intBrID = CType(pdBRPDColl(_strbrvm).GetValue(rwBR), Integer)
                    strBRName = CType(pdBRPDColl(_strbrdm).GetValue(rwBR), String)
                    newBR = New Building(newOBJ, intBrID, strBRName)
                    If Not _orgs.ContainsKey("bld" & intObjID) Then _orgs.Add("bld" & intObjID, newBR)
                    newOBJ.Nodes.Add(newBR)
                Next
            Next
        Next
        Me.EndUpdate()
    End Sub

PM MAIL   Вверх
diadiavova
Дата 13.11.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(barulya @  13.11.2009,  18:48 Найти цитируемый пост)
Подскажите пожалуйста, как отключить контролы от bindingsource для ускорения заполнения дерева? 

Видимо так же как и подключил - при помощи свойства DataSource.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
barulya
Дата 13.11.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



Насколько я понял, то нужно перебирать все контролы и указывать для каждого BindingSource=Nothing.
Если так, то уменя получается это около 60-ти контролов... Как быть перебирать их вручную? И второй вопрос из конструктора дерева не видно какие это контролы.
PM MAIL   Вверх
diadiavova
Дата 13.11.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



barulya, я из кода ничего не понял, да это и не мудрено, это всё-таки фрагмент. К тому же фрагмент ссылающийся на множество объектов, объявленных за пределами приведённого фрагмента. Если неясно какие именно контролы надо отвязывать от источника данных, тогда не знаю что тут можно сделать, но если всё-таки есть способ их определить, то можно загнать их в коллекцию и в отдельном методе перебирать эту коллекцию и выполнять над ними нужные действия.

Но тут есть другой вопрос, а почему на время построения дерева не отключить сами байндингсорсы от таблиц? В конце концов отбор данных и вручную выполнить несложно. При помощи тех же линк-запросов например.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
barulya
Дата 13.11.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



Так, если отключить байдингсорсы от таблиц, данные также будут доступны?
PM MAIL   Вверх
diadiavova
Дата 13.11.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(barulya @  13.11.2009,  20:32 Найти цитируемый пост)
Так, если отключить байдингсорсы от таблиц, данные также будут доступны?

Дык смотря где. К таблицам ты имеешь и прямой доступ, а в чём проблема то? Байндингсорсы нужны для управления привязкой данных к контролам, а сами данные доступны и безо всяких байндингсорсов. Мало того, при необходимости можно и к контролам подключить таблицу непосредственно, просто тогда нельзя будет некоторые действия выполнять, типа фильтрации данных, синхронизации перемещения указателя и прочего. Если данные просто надо использовать для построения дерева, то байндингсорсы тут вообще не при чём.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
barulya
Дата 13.11.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



А с линк-запросами не работал, попробую в этом направлении, спасибо. Я пытался SuspendBinding и ResumeBinding использовать перед перебором и после него соответственно. Но при этом обратиться к текущей записи было не возможно, и не изменялся Position.
PM MAIL   Вверх
diadiavova
Дата 13.11.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



barulya, не видя задачи целиком сложно что-либо советовать. Построение дерева по данным представленным в виде линейных списков - задача не такая уж и сложная, но при чём тут связывание с данными я честно говоря не вполне врубился, так что не знаю, может я тебя и не туда направил smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
barulya
Дата 13.11.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



Собственно цель, которю я преследовал, ускорение создания дерева, в списке около 3 тыс. орг-ций, чуть больше объектов и раза в полтора больше зданий.  Я делал прямым обращением к дататейбл, но после перехода к байндингсорс заметил, что процесс намного быстрее происходит. Но проблема состояла в том, что я мог загрузить только организации, и только в первую организацию добавлялись объекты, и в свою очередь в первый объект добавлялись здания. Т.е. в байдингсорсах объектов и зданий курсор записи фильтровались по курсору байдингсорса организаций. И еще работать с данными придется и другим частям приложения и отследить в каком из процессов были изменены, добавлены или удалены данные (синхронизировать) будет сложнее. По событиям байдингсорсов это на мой взгляд будет проще. или иначе каждый раз перезагружать всю структуру из базы данных.
PM MAIL   Вверх
diadiavova
Дата 14.11.2009, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



А как вся система связана с контролами, подключенными к байдингсорсам и которые тормозят загрузку?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
barulya
Дата 14.11.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



Не понял вопроса?

Это сообщение отредактировал(а) barulya - 14.11.2009, 10:40
PM MAIL   Вверх
diadiavova
Дата 14.11.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(barulya @  14.11.2009,  10:27 Найти цитируемый пост)
Не понял вопроса?

Ну ты пишешь
Цитата(barulya @  13.11.2009,  18:48 Найти цитируемый пост)
Подскажите пожалуйста, как отключить контролы от bindingsource для ускорения заполнения дерева?

Вот я и спрашиваю: "Какие контролы и каким образом они влияют на заполнение дерева?".


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
barulya
Дата 14.11.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



Среди забинденных контролов есть текстбоксы, комбобоксы, чекбоксы, а также таблица "объекты" связана с 4-мя таблицами по приципу мастер-деталь, а таблица "здания" имеет 8 связанных таблиц по томуже принципу, которые в свою очередь забиндены с DataGridView. И как следствие тормозит команда bindingsource.position при его смене.
Чтобы иметь общее представление о количестве данных прикрепляю картинку:

Это сообщение отредактировал(а) barulya - 14.11.2009, 12:04

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  11.jpg 148,17 Kb
PM MAIL   Вверх
diadiavova
Дата 14.11.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



barulya, я понимаю, что у тебя какая-то сложная структура данных и всё такое, но я уже сколько бьюсь никак не могу добиться ответа на вопрос, как байндингсорсы связаны с сабжем. В заголовке темы и первом посте речь шла о проблемах с формированием дерева, теперь ты говоришь о тормозах при перемещении указателя. Из этого я делаю вывод, что данные для формирования дерева ты вытаскиваешь то ли из грида, то ли из ещё какого-то контрола, список элементов в котором фильтруется при помощи байндингсорса. Если проблема именно в этом, то я уже ответил - строй дерево по данным из таблиц, а не из контролов. Если я опять тебя не понял, значит видно не судьба.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
barulya
Дата 14.11.2009, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



diadiavova, 
Я вытягивал данные напрямую из таблиц используя байдингсорсы, но при этом в байдингсорсах объектов и зданий в свойствах датасорс указывал соответствующую родительскую таблицу, а в датамембер указывал связи с дочерними таблицами. Заполнял дерево при возникновении событий ListChanged со значение Reset каждого байдингсорса внутры конструктора дерева. т.е. я его заполнял не из внешнего кода, а так сказать изнутри перебирая последовательно по иерархии строки в каждом списке. И перебирая соответственно каждые строки у меня происходили множественные фильтрования списков и привязки к контролам. Я делал это для того, чтобы быстрее и удобнее синхронизировать изменение положения курсора в дереве и байдингсорсах (используя значения индексов элементов). Но к сожалению я пошел по неверному пути.  После того как в байдингсорсах в значении свойств датасорс я указал свой датасет, а в значениях датамембер я указал соответствующие таблицы. Теперь мне стали доступны все элементы списков подчиненных таблиц без фильтрования, что дает мне возможность заполнения дерева. Просто при выборе элемента возвращается его ИД и по нему используя поиск устанавливается курсор на нужную запись в байдингсорсах. Так что проблема я думаю решена. Спасибо за внимание и уделенное время.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0930 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.