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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView+DataGrid+БД 
:(
    Опции темы
W1zArD
Дата 30.7.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрых суток...
Задача которая просто горит...
видно для ее решения мой IQ слишком мал =(
(я понимаю что уже надоел, но мне некуда больше обратиться... я надеюсь на вашу поддержку)

Постановка задачи:
Программа имеющая древовидную схему (TreeView) в которой допустим находится список подразделений,
к каждому подразделению относятся определенные сотрудники...
(используется MS Access)
1 Таблица
Id:счетчик -ключ
Title:string -имя нода
ParentId:string -имя нода родителя

2 Таблица
ID:счетчик -ключ
Name:string -Ф.И.О.
JobTitle:string -должность
Salary:string -зар. плата
ParentHeadId:ссылка -указатель на ID строку из 1 Таблицы

Описание проблемы =/
1. не могу нормально сделать бд (раз 5-7 за сегодня переделывал)
как должна выглядеть структура?
(на данный момент
имеется 2 таблицы (структура TreeView и Соответственно сами записи)

2. каким образом мне загружать/сохранять ноды у treeView?

3. как мне связать отображение записей в DataGrid с TreeView (знаю что руками, но как? Подозреваю: событие AfterSelect(TreeView) запрос использующий JOIN)

вроде бы все...
P.S. старался максимально описать суть проблем... Файл с БД+исходники в Аттаче...
тема ("Как сохранить TreeView в БД? И какой должна быть структура самой БД") не решила моей проблемы...

Благодарю за внимание...

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  SecondAttempt1ex.7z 74,17 Kb
PM   Вверх
Colloseum
Дата 30.7.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Значит делаешь так.

1. Для начала конструируешь таблицу для дата сета.
Нормально сделать таблицу значит такую же как и физически в БД.
Код


    DataSet ds = null;
    DataTable tbl = null;
    DataColumn col = null;

    public void Table_Regions()
    {
        //Создаем таблицу регионы. Копируя структуру той что в БД
        tbl = new DataTable("Regions");

        ds.Tables.Add(tbl);

        col = tbl.Columns.Add("ID");
        col.AllowDBNull = false;
        col.AutoIncrement = true;
        col.AutoIncrementSeed = 1;
        col.AutoIncrementStep = 1;
        col = tbl.Columns.Add("RegionName", typeof(string));
        col.AllowDBNull = false;
        col.Unique = true;

        tbl.PrimaryKey = new DataColumn[] { tbl.Columns["ID"] };
    }

    public void Table_Countries(bool AddRelation)
    {
        //Создаем таблицу страны. Копируя структуру той что в БД
        tbl = new DataTable("Countries");

        ds.Tables.Add(tbl);

        col = tbl.Columns.Add("ID");
        col.AllowDBNull = false;
        col.AutoIncrement = true;
        col.AutoIncrementSeed = 1;
        col.AutoIncrementStep = 1;

        col = tbl.Columns.Add("RegionID", typeof(int));
        col.AllowDBNull = false;
        col = tbl.Columns.Add("CountryName", typeof(string));
        col.AllowDBNull = false;
        col.Unique = true;
        col = tbl.Columns.Add("TelCode", typeof(string));
        col = tbl.Columns.Add("FQName", typeof(string));

        tbl.PrimaryKey = new DataColumn[] { tbl.Columns["ID"] };

        if (AddRelation == true)
        {
            tbl.Constraints.Add(new ForeignKeyConstraint(ds.Tables["Regions"].Columns["ID"], tbl.Columns["RegionID"]));

            rel = new DataRelation("CountriesRegions", ds.Tables["Regions"].Columns["ID"], ds.Tables["Countries"].Columns["RegionID"]);
            ds.Relations.Add(rel);
        }
    }


Далее заполняешь таблички таким макаром.
Код

    SqlCommandBuilder AutoUpdateDatabase = null;
    string DBServerConnectionLine = "Data Source=.;Initial Catalog=VENUS_FINANCE_BANK;Integrated Security=True";

    SqlDataAdapter daRegions = null, daCountries = null;

    public void Fill_Tbl_Regions()
    {
        string strSQl = "SELECT * FROM Regions;";
        daRegions = new SqlDataAdapter(strSQl, DBServerConnectionLine);

        AutoUpdateDatabase = new SqlCommandBuilder(daRegions);

        daRegions.Fill(ds, "Regions");
    }

    //Заполнение т.Страны из БД
    public void Fill_Tbl_Countries()
    {
        string strSQl = "SELECT * FROM Countries;";
        daCountries = new SqlDataAdapter(strSQl, DBServerConnectionLine);

        AutoUpdateDatabase = new SqlCommandBuilder(daCountries);

        daCountries.Fill(ds, "Countries");
    }


SqlCommandBuilder это для будующего обновления БД, будет.

теперь просто заполняем Дерево. Я правда подозреваю что заполнить дерево можно и проще и быстрее но мне пока доступно только так.
Код

     TreeView GenericTree;
    //Метод обновления TreeView на основе существующего DataSet'a
    //Только для двухуровнего дерева
    public void Update(string[] ParentFields, string[] ChildFields)
    {
        GenericTree.BeginUpdate();
        GenericTree.Nodes.Clear();

        foreach (DataRow row in ds.Tables[TableNames[0]].Rows)
            GenericTree.Nodes.Add(row[ParentFields[0]].ToString(), row[ParentFields[1]].ToString(), 1);

        foreach (DataRow row in ds.Tables[TableNames[1]].Rows)
            GenericTree.Nodes[row[ChildFields[0]].ToString()].Nodes.Add(row[ChildFields[0]].ToString(), row[ChildFields[1]].ToString(), 2);

        GenericTree.EndUpdate();
    }

Два массива содержат только по два элемента 1-й {ID и Название которое отобразится в Дереве} и для второго уровня {ParentHeadId и Название которое отобразится в Дереве}.

Вызываеш это чудо "Деревопостроитель" так
Код

GenericTree = treeView1;
treeView1 = LoadTreeView(treeView1);


Может навскидку этот код не откомпилится (так как выдрал это из классов которые писал для изучения как раз такого вопроса) но я так делаю.
Будут вопросы пиши будем разбирать.
Ах да еще код неэффективный представлен но пока только так.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

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


 




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


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

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