Нужна помощь по Treeview

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем rom@n, 11 июн 2008.

  1. rom@n

    rom@n Гость

    Репутация:
    0
    Проблема такая.
    На сколько я понимаю TreeView в С++ заполняется с использованием Item[] который автоматически нумеруется сам при заполнении. А можно ли его заполнять как-нить используя другое свойство, например как в VB? где каждому Node сам присваиваешь значение свойства key. Это очень удобно при заполнении TreeView из БД где для каждой записи указывается id родительской записи.
     
  2. etc

    etc Гость

    Репутация:
    0
    см TTreeNode.Data
     
  3. rom@n

    rom@n Гость

    Репутация:
    0
    Не пойму TTreeNode это элемент или метод для работы с TreeView?
     
  4. etc

    etc Гость

    Репутация:
    0
    rom@nыч F1
     
  5. rom@n

    rom@n Гость

    Репутация:
    0
    Я не шарю по англ. )))) не могу сам разобраться ))
    Были б примеры разобрался бы. Может поможешь чем, или ссылками хотя б
     
  6. etc

    etc Гость

    Репутация:
    0
    F1 + Demos
     
  7. rom@n

    rom@n Гость

    Репутация:
    0
    Нашел вот это:
    DMod->SPBrowStruk->Params->ParamValues["@ParentID"]=0;
    DMod->SPBrowStruk->Params->ParamValues["@Pokaz"]=0;
    DMod->SPBrowStruk->ExecProc(); //получаем все узлы
    DMod->SPBrowStruk->Active=true;
    DMod->SPBrowStruk->First();
    while(!DMod->SPBrowStruk->Eof)
    {
    DanNod=new TDanNod;
    DanNod->IDPodr= DMod->SPBrowStruk->Fields->FieldByName("idNode")->AsInteger;
    DanNod->IDParent= DMod->SPBrowStruk->Fields->FieldByName("idParent")->AsInteger;
    DanNod->Name= DMod->SPBrowStruk->Fields->FieldByName("NodeName")->AsString;
    if(DMod->SPBrowStruk->Fields->FieldByName("idParent")->AsInteger==0) //если узел корневой
    {
    TV->Items->AddObject(NULL, DMod->SPBrowStruk->Fields->
    FieldByName("NodeName")->AsString, DanNod);
    }
    else //в противном случае находим родителя и добавляем узел к нему подчиненным
    {
    int iCount=TV->Items->Count;
    for(int j=0; j<iCount; j++)
    {
    TDanNod *dat;
    dat=(TDanNod*)TV->Items->Item[j]->Data;
    if(dat)
    {
    if(DMod->SPBrowStruk->Fields->FieldByName("idParent")->AsInteger==dat->IDPodr)
    {
    TV->Items->AddChildObject(TV->Items->Item[j],
    DMod->SPBrowStruk->Fields->FieldByName("NodeName")->AsString,
    DanNod);
    break;
    }
    }
    }
    }
    DMod->SPBrowStruk->Next();
    }
    DMod->SPBrowStruk->Active=false;

    Как работае понял, но еще пока не пробовал на практике.

    Но при таком заполнении TreeView получается что при каждом добавлении элемента просматриваются все элементы уже добавленные, пока не попадется тот куда нужно добавить. Это по-моему не правильно и совсем не быстро.
    Может Есть другой способ заполнения????
     
  8. etc

    etc Гость

    Репутация:
    0
    А сами вы надо думать писать не будете, только скопипастить?
    не нравиться этот алгоритм, придумайте свой, в чем проблема?
     
  9. rom@n

    rom@n Гость

    Репутация:
    0
    Дак вот я и спрашиваю есть какой нить другой алгоритм, такой что бы не перебирать все записи при добавлении. Может есть какой нить другой компонент типа TreeView но похожий на TreeView в VB.
     
  10. rom@n

    rom@n Гость

    Репутация:
    0
    Придумал другой алгоритм. Кого интересует, создал массив, в который, при каждом добавлении записи в TreeView, записывал номер добавляемого Item'а
    Вот код:
    ADOTableGroup->Last();
    int tgc = ADOTableGroup->FieldByName("id")->AsInteger;
    int *ArrGroup = new int[tgc];
    int i=0;
    TreeView->Items->Clear();
    TreeView->Items->Add(NULL,"XXX");
    ADOTableGroup->First();
    ArrGroup[0] = 0;
    while (!ADOTableGroup->Eof)
    {
    i++;
    ArrGroup[ADOTableGroup->FieldByName("id")->AsInteger] = i;
    TreeView->Items->AddChild(TreeView->Items->Item[ArrGroup[ADOTableGroup->FieldByName("Group")->AsInteger]],ADOTableGroup->FieldByName("Name")->AsString);
    ADOTableGroup->Next();
    }

    Но возникает другая проблема: если дочерняя запись в Базе Данных находится раньше, по отношению к родительской, то возникнет ошибочка несуществующей родительской записи.
    Может подскажете как можно организовать заполнение более удобно TreeView учитывая это.
     
  11. etc

    etc Гость

    Репутация:
    0
    Сортировать предварительно не пробовали?

    или фильтровать, что гдето равнозначно ...
     
  12. rom@n

    rom@n Гость

    Репутация:
    0
    Спасибо, уже сам сделал. Сразу что то сам не догадался.
     
Загрузка...
Похожие Темы - Нужна помощь по
  1. petiablack
    Ответов:
    0
    Просмотров:
    39
  2. kuric
    Ответов:
    0
    Просмотров:
    327
  3. msfconsole
    Ответов:
    0
    Просмотров:
    418
  4. slavkan777
    Ответов:
    3
    Просмотров:
    960
  5. serauto79
    Ответов:
    3
    Просмотров:
    1.035

Поделиться этой страницей