2009-12-16 539 views
1

我正在開發一個小型的C#windows應用程序,並需要進行分層結構設計。我正在使用來自數據庫的單層類別,即沒有子類別。我想去看看並允許用戶創建多個級別類別。我看着這個線程Data structure for Category,但我在想如果有更簡單的方法來處理這類問題?因爲我不確定這是否是問題的最佳解決方案。C#分層結構分類結構

我將不勝感激,如果有人可以提供數據庫表結構和一些C#代碼代碼去與它。此外,我想檢查是否可以從其父母處獲取所有子類別ID(包括子子女)。

回答

0

如果你的層級是剛性的,不會改變,你可以對它進行硬編碼。

該線程是關於流體層次結構,可能會不斷變化,在這種情況下,討論的解決方案是適當的。

0

Harvinder,

您是否考慮過使用TreeView控件來達到您的目的?我想這將是一個完美的想法。請查看有關TreeView控件的MSDN網站。 Click here

+0

嗨 是的樹視圖確實符合我的一些要求,但我想爲列表中的每個記錄(行)都有真實圖像。我發現了ObjectListView庫,似乎有能力實現這一點。 http://objectlistview.sourceforge.net/cs/index.html – Harvinder 2009-12-19 15:41:39

4
create table Category 
(
    id int primary key identity, 
    parent_id int, 
    name varchar(100), 
    foreign key (parent_id) references Category (id) 
) 

class Category 
{ 
    int id; 
    string name; 
    Category Parent; 
    IList<Category> Children; 
} 

這是一個天真的解決方案來建立一棵樹,當你解除凍結您的對象層次,該解決方案將需要一堆DB選擇的。您還需要存儲一些將減少選擇數量的信息,並記住樹中節點的順序。

Joe Celko在SQL樹上有written quite a bit,它比我能輸入的任何東西都重要。我發現鏈接,同時在sqlteam.com上查看「More Trees & Hierarchies in SQL

0

感謝您閱讀我的問題的回覆和考慮。

我目前已經有一個單一的類別設置的結構,我很容易知道。我正在考慮採取稍微簡單的路線(我認爲這是更簡單的路線,但可能是錯誤的)。

我目前正在考慮在名爲children_ids的分類表中添加一個額外的列。這樣所有的父母都會保留孩子的記錄而不是其他方式。我children_ids列可以是文本類型和ids可以存儲在一個字符串格式,即1-4-5-7-8等,一旦我從數據庫中得到這個列,我可以用' - '拆分字符串,並獲得所有其子女的ID。

我認爲這樣會讓我更容易留意所有的人口;),只要問家長有關他們的孩子。我認爲這也會減輕依賴性,因爲我只需要得到一個所有孩子(遞歸地低於所有級別)的列表,我猜更快。通過這種方式,我還可以在從數據庫中加載它們之前對所有實體進行排序,但另一個頭痛消失了。

我相信在那裏必須有更好的解決方案,但不知道是否會更容易。

我的其他要求是創建一個帶有這種類別的子 - 父類型的下拉組合框,類似於用戶通過它們選擇的文件夾列表結構。也許像CodeProject exampleCodeGuru example,我可能會使用任何一種方法讓我的生活變得更容易一些。

問題是我想在下拉菜單的每個記錄中添加更多細節,例如cat_id等,但不希望它們對用戶可見,這是爲了獲得有關用戶選擇的詳細信息。我想我將不得不通過單獨的ArrayList來彌補它,可能會包含所有類別的細節,然後只要用戶從下拉列表中選擇一條記錄,就可以進入索引位置。我在想什麼?

感謝您閱讀和回覆!

+0

鏈接似乎被打破... – 2012-08-03 07:10:37

0

Harvinder,

你正在考慮數據庫結構將很好地工作,但它有一些缺點:

  • 簡單的SQL查詢找到指定節點的所有的孩子是不可能的(你會執行字符串操作)
  • 兒童的數量排序是不可能從SQL查詢中
  • 得到節點的子節點的集合,你必須連接到數據庫幾次(讓每個孩子分別由它的ID)

最常見的做法是存儲單ID(父)在一列中。在這種情況下,多個孩子可以指向同一父母(關係一對多),這可以有效地解決您的問題。你可以很容易地回答你的問題的第二部分:除非你真的必須,不要使用Windows窗體(兩個作者都使用它) - 你會發現你非常疲憊,將你的數據結構綁定到你的視圖。爲你的目的使用WPF是一個好得多的主意,並靈活地修改Combobox和Treeview Datatemplates來面對你的需求。如果您對WPF不熟悉,請首先查看關於WPF和MVVM設計模式的brilliant article - 它甚至包含Treeview示例,這對您的情況會有所幫助。

請告訴我,如果我的答案解決了您的問題。我很樂意回答有關WPF的任何問題。

+0

感謝您的詳細信息,是的存儲parent_id似乎是更好的解決方案的問題。然而,我將使用children_id來代替,因爲我的要求是,一旦獲得了父項,我就可以獲得所有子項,我將從我的應用程序而不是數據庫中處理這些項目(我知道這將會非常耗費CPU週期)但對我來說似乎是一個更簡單的解決方案。所以我會將所有的類別動態加載到應用程序中並從那裏創建樹,它將只是一個小的遞歸方法。 – Harvinder 2009-12-22 17:43:00

+0

現在,我正在尋找一個好的庫來處理treelistviews中的圖像,我找到了一個名爲ObjectListView的好庫,它處理圖像,但文檔和示例並不多,因此仍在測試和玩弄它。 謝謝 – Harvinder 2009-12-22 17:44:56

+0

不是問題:)任何問題 - 只問我。 – 2009-12-22 19:11:15