感谢您抽出时间阅读这篇文章。
从我的 SQL 数据库获取数据时,我在尝试构建分层对象时遇到了麻烦。请注意,我是一个新手程序员。
如何构建具有未知级别的分层对象?当我说未知级别时,我的意思是每个节点可能有不同数量的子节点,而子节点又可能有不同数量的自己的子节点,依此类推。
这个想法是我需要使用我的 SQL 数据创建一个层次对象来绑定到 WPF TreeView 控件。
下面我已经包含了我到目前为止的代码。第一段代码是我的由属性组成的类。请注意,“Products”类有一个 ObservableCollection 引用自身。我认为这就是构建嵌套节点的方式。即列表中的列表。
第二段代码是我从 SQL 数据库下载数据的 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 DB 获取数据的方法:
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 *******************
请在下面找到下载我的项目代码的链接(这仅包含树视图代码)。有人可以看看它,看看为什么我不能创建超过 2 个级别的节点吗?
该代码是由用户 HB MAAM 提供给我的。感谢“HB MAAM”到目前为止的帮助!