感謝您抽出時間閱讀本文。如何從SQL查詢構建對象層次結構? (對於WPF TreeView)
我在從SQL數據庫獲取數據時嘗試構建層次結構對象時遇到問題。 請注意,我是一個新手程序員。
你如何建立一個層次不明的對象?當我說未知級別時,我的意思是,每個節點可能具有不同數量的子節點,而子節點又可能具有不同數量的自己的子節點,如此等等。
這個想法是我需要創建一個使用我的SQL數據綁定到WPF TreeView控件的分層對象。
下面我已經包含了我到目前爲止的代碼。 代碼的第一位是我的類由屬性組成。請注意,「Products」類具有引用自身的ObservableCollection。我認爲這是你構建嵌套節點的方式。即列表內的列表。
第二段代碼是我從Get數據庫下載數據的Get方法。這裏是我需要的一些如何將下載的數據分類到層次結構中。
產品類別(屬性)
public class Products : INotifyPropertyChanged, IDataErrorInfo
{
private Int64 m_ID;
private SqlHierarchyId m_Hierarchy;
private string m_Name;
private ObservableCollection<Products> m_ChildProducts;
// Default Constructor
public Products()
{
ChildProducts = new ObservableCollection<Products>();
}
//Properties
public Int64 ID
{
get
{
return m_ID;
}
set
{
m_ID = value;
OnPropertyChanged(new PropertyChangedEventArgs("ID"));
}
}
public SqlHierarchyId Hierarchy
{
get
{
return m_Hierarchy;
}
set
{
m_Hierarchy = value;
OnPropertyChanged(new PropertyChangedEventArgs("Hierarchy"));
}
}
public String Name
{
get
{
return m_Name;
}
set
{
m_Name = value;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}
public Int16 Level
{
get
{
return m_Level;
}
set
{
m_Level = value;
OnPropertyChanged(new PropertyChangedEventArgs("Level"));
}
}
public Int64 ParentID
{
get
{
return m_ParentID;
}
set
{
m_ParentID = value;
OnPropertyChanged(new PropertyChangedEventArgs("ParentID"));
}
}
public ObservableCollection<Products> ChildProducts
{
get
{
return m_ChildProducts;
}
set
{
m_ChildProducts = value;
OnPropertyChanged(new PropertyChangedEventArgs("ChildProducts"));
}
}
//INotifyPropertyChanged Event
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
}
方法,該方法從SQL數據庫中獲取數據:
public static ObservableCollection<Products> GetProductsHierarchy()
{
ObservableCollection<Products> productsHierarchy = new ObservableCollection<Products>();
SqlConnection connection = new SqlConnection(DBConnection.GetConnection().ConnectionString);
string selectStatement = "SELECT ID, Hierarchy, Name, Hierarchy.GetLevel() AS Level, Hierarchy.GetAncestor(1) AS ParentHierarchy, " +
"(SELECT ID " +
"FROM SpecProducts " +
"WHERE (Hierarchy = SpecProducts_1.Hierarchy.GetAncestor(1))) AS ParentID " +
"FROM SpecProducts AS SpecProducts_1 " +
"WHERE (EnableDisable IS NULL) " +
"ORDER BY Hierarchy";
SqlCommand selectCommand = new SqlCommand(selectStatement, connection);
try
{
connection.Open();
SqlDataReader reader = selectCommand.ExecuteReader();
while (reader.Read())
{
Products product = new Products();
product.ID = (Int64)reader["ID"];
product.Name = reader["Name"].ToString();
product.Hierarchy = (SqlHierarchyId)reader["Hierarchy"];
product.Level = (Int16)reader["Level"];
if (reader["ParentID"] != DBNull.Value)
{
product.ParentID = (Int64)reader["ParentID"];
}
else
{
product.ParentID = 0;
}
productsHierarchy.Add(product);
// *** HOW TO BUILD HIERARCHY OBJECT WITH UNKNOWN & VARYING LEVELS?
// *** ADD PRODUCT TO CHILDPRODUCT
}
return productsHierarchy;
}
catch (SqlException ex)
{
throw ex;
}
finally
{
connection.Close();
}
}
下面我已附加表示我的SQL查詢的數據的結構的圖像。 請注意,未來添加更多產品時,層級可能會變得更深。我需要創建的Hierarchy對象應該具有足夠的靈活性,以便無論節點級別的數量如何都可以擴展。
非常感謝您的時間,所有幫助非常感謝。
*********編輯26/04/2012 14:37 *******************
請在下面找到一個鏈接,下載我的項目代碼(這裏只包含treeview代碼)。 有人可以看看它,看看爲什麼我不能創建2級以上的節點?
該代碼是由用戶HB MAAM給我的。感謝您「HB MAAM」迄今的幫助!
Click this link to download code
您能否顯示層次結構的基本視覺效果?通過僞代碼。 – 2012-04-24 16:01:10
嗨。感謝您的答覆。我現在可以上傳圖片到這個論壇。請在我的文章中找到我的SQL數據看起來像給定的查詢。我已經從原來的方式略微修改了SQL查詢。所有更新已在上面的代碼中修改。 – RobHurd 2012-04-24 16:37:46
不需要所有那只是parentId會很好 – 2012-04-24 17:09:39