이 게시물을 읽는 시간을내어 주셔서 감사합니다.SQL 쿼리에서 개체 계층 구조를 작성하는 방법은 무엇입니까? (for WPF TreeView)
SQL 데이터베이스에서 데이터를 가져올 때 계층 적 개체를 만드는 데 문제가 있습니다. 저는 초보자 프로그래머입니다.
레벨을 알 수없는 계층 구조 개체는 어떻게 작성합니까? 내가 알지 못하는 레벨을 말하면, 각 노드는 다양한 수의 자식 노드를 가질 수 있으며, 차례대로 자식 노드의 수가 달라질 수 있습니다.
아이디어는 WPF TreeView 컨트롤에 바인딩하기 위해 SQL 데이터를 사용하여 계층 적 개체를 만들어야한다는 것입니다.
아래에는 지금까지 가지고있는 코드가 포함되었습니다. 코드의 첫 번째 비트는 속성으로 구성된 클래스입니다. "Products"클래스에는 자체를 참조하는 ObservableCollection이 있습니다. 이것이 중첩 된 노드를 만드는 방법이라고 생각합니다. 즉 목록 내의 목록.
두 번째 코드는 SQL 데이터베이스에서 데이터를 다운로드하는 Get Get 메서드입니다. 다음은 다운로드 된 데이터를 계층 구조로 정렬하는 방법입니다.
제품 클래스 (속성) SQL DB에서 데이터를 가져
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();
}
}
. 추후에 더 많은 제품이 추가 될 때 계층 구조 수준이 더 깊어 질 수 있습니다. 생성해야하는 Hierarchy 객체는 노드 수준의 수에 관계없이 확장 할 수있을만큼 유연해야합니다.
시간 내 주셔서 대단히 감사합니다. 모든 도움을 주시면 대단히 감사하겠습니다.
********* EDIT 26/04/2012 14시 37분 *******************
내 프로젝트 코드를 다운로드하는 링크를 찾으십시오 (여기에는 treeview 코드 만 포함). 누군가 2 레벨 이상으로 노드를 만들 수없는 이유를 확인해 주실 수 있습니까?
코드는 HB MAAM이라는 사용자가 나에 게주었습니다. 지금까지 도움을 주신 "HB MAAM"에게 감사드립니다!
Click this link to download code
내가 당신을 위해 예제를 만들 것입니다
계층의 기본 시각을 표시 할 수 있습니까? 의사 코드를 통해 .. –
안녕하세요. 귀하의 회신에 감사드립니다. 이제이 포럼에 이미지를 업로드 할 수 있습니다. 주어진 쿼리에서 내 SQL 데이터가 어떻게 생겼는지를 내 게시물로 수정하십시오. 원래 SQL 쿼리를 수정했습니다. 위의 코드에서 모든 업데이트가 수정되었습니다. – RobHurd
부모님의 모든 필요는 없습니다. –