2009-04-19 2 views
2

Я хотел бы заполнить Treeview.Лучшая практика Treeview, населяющая различные виды объектов

Вот что я имею в БД:

стол Box BoxID BOXNAME

стол Книга: BookID BookName BoxID (Ф.К. Box.BoxID)

таблица Глава: ГлаваID Глава Название BookID (fk Book.BookID)

Как вы знаете, древовидная структура состоит из объекта treenode. Объект treenode имеет свойство text и свойство тега. Свойство «текст» - это текст, который он отображает на экране для этого узла, а «тег» - это «скрытое» значение (обычно используется для идентификации узла).

Так что в моем случае; поля, заканчивающиеся на ID, будут использоваться в свойстве «tag», а поля, заканчивающиеся на Name, будут использоваться в свойстве «text».

пример: поэтому для книги; Я буду использовать поле BookID для свойства «tag» и «BookName» для свойства «text».

примечание: я использую dbml, поэтому у меня есть объект Book, объект Box и объект Chapter, и я использую linq для их получения от дБ.

Итак, мой вопрос: Какова наилучшая практика для создания этого дерева?

У меня есть решение, но это действительно уродливо, потому что похоже, что я дублирую код. Проблема в том, что значения, которые мне нужно извлечь для свойств текста и тега, идентифицируются по имени полей differents в db

Итак, для уровня книги мне нужно получить поле BookID, чтобы заполнить свойство тега моего узел; для уровня ящика мне нужно, чтобы поле BoxID заполнило свойство тега, ...

Как я могу сделать своего рода общий способ сделать это?

Я надеюсь, что я сделал себе достаточно ясно, не стесняйтесь задавать мне вопросы :)

Thx заранее

ответ

1

Вот что у меня есть на данный момент

я получаю список коробки с Linq (DBML) запроса.

List<Box> MyListofBox = getMyListofBox(); 
Treenode tnBox = null; 
Treenode tnBook =null; 
foreach(Box b in MyListofBox) 
{ 
    tnBox = new TreeNode(); 
    tnBox.tag = b.BoxID; 
    tnBox.text = b.BoxName; 

    List<Book> MyListofBook = getMyListofBookByBoxID(b.BoxID) 
    foreach(Book boo in MyListofBook) 
    { 
     tnBook = new TreeNode(); 
     tnBook.tag = boo.BookID; 
     tnBook.text = boo.BookName; 
     tnBox.nodes.add(tnBook); 
    } 
    mytreeview.nodes.add(tnBox); 
} 

, но я, конечно, не нравится это решение ...

у вас есть лучший путь?

0

Я бы извлечь вам нужно из базы данных в виде структуры, возможно, через анонимный тип, который был добавлен в C# вместе с linq. Затем я заполнил бы эти данные в нужное место в дереве.

Из того, что я получаю, вы пытаетесь получить каждое свойство отдельно, что не будет работать так хорошо, потому что тогда вам придется сделать звонок в базу данных для каждого отдельного имущества, что очень расточительно.

Добавка на основе того, что вы добавили

Я не считаю, что код может быть более компактным - имена вы называете похожи, но не то же самое, и, как вы делаете это было то, что я пытался объяснить ранее.

+0

Я получаю список ящиков с запросом linq (dbml). Я получаю Список Treenode tnBox = null; Treenode tnBook = null; foreach (Box b in MyListofBox) { tnBox = new TreeNode(); tnBox.tag = b.BoxID; tnBox.text = b.BoxName; Список MyListofBook = getMyListofBookByBoxID (b.BoxID) Еогеасп (Книга бух в MyListofBook) { tnBook = новый TreeNode(); tnBook .tag = boo.BookID; tnBook .text = boo.BookName; tnBox.nodes.add (tnBook); } mytreeview.nodes.add (tnBox); } } – GillouX

0

Вы можете

  1. Определить интерфейс ключ/значение, что и Box и книги реализации
  2. Определить делегат, который возвращает TreeNode и создать методы делегата, которые принимают Box и книги

Однако , Я думаю, что код в порядке, как написано. Иногда вам просто нужно закодировать его, и нет никакого смысла в дальнейшем абстрагировании или его оптимизации.

Единственная проблема, которую я вижу в коде, заключается в том, что вы делаете вызов базы данных в цикле. Независимо от того, зависит ли эта проблема от приложения.

+0

Так что, я думаю, я собираюсь сохранить свое решение. thx в любом случае – GillouX

Смежные вопросы