このポストを読む時間を取ってくれてありがとう。SQLクエリからオブジェクト階層を構築する方法は? (for WPF TreeView)
SQLデータベースからデータを取得するときに階層オブジェクトを作成しようとしています。 私は少し初心者のプログラマーです。
レベルが不明な階層オブジェクトを作成するにはどうすればよいですか?私が知らないレベルを言うと、各ノードにはさまざまな数の子ノードがあり、その子ノードにはさまざまな数の子ノードがある可能性があります。
私は、SQLデータを使用してWPF TreeViewコントロールにバインドする階層オブジェクトを作成する必要があると考えています。
以下、これまでのコードを含めました。 コードの最初のビットは、プロパティで構成された私のクラスです。 "Products"クラスにはObservableCollectionが参照されています。私はこれがネストしたノードを構築する方法だと思います。すなわち、リスト内のリスト。
2番目のコードは、SQLデータベースからデータをダウンロードする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分*******************
私のプロジェクトコードをダウンロードするリンクを見つけてください(これにはツリービューコードしかありません)。 誰かが2レベルを超えてノードを作成できない理由を見てみることができますか?
コードは、ユーザーHB MAAMによって私に与えられました。これまでのあなたの助けを "HB MAAM"ありがとう!
Click this link to download code
あなたは階層の基本的なビジュアルを表示できますか?擬似コードを介して.. –
こんにちは。お返事をありがとうございます。私は今このフォーラムに画像をアップロードすることができます。指定したクエリから私のSQLデータがどのように見えるかを私の投稿に修正してください。私は元々のSQLクエリを少し変更しました。上記のコードですべてのアップデートが修正されました。 – RobHurd
親のためのすべての必要はありません –