この投稿を読むために時間を割いていただきありがとうございます。
SQL データベースからデータを取得するときに、階層オブジェクトを構築しようとすると問題が発生します。私は少し初心者のプログラマーであることに注意してください。
未知のレベルを持つ階層オブジェクトをどのように構築しますか? 不明なレベルとは、各ノードにさまざまな数の子ノードがあり、さらにさまざまな数の独自の子ノードがあるということです。
アイデアは、SQL データを使用して階層オブジェクトを作成し、WPF TreeView コントロールにバインドする必要があるということです。
以下に、これまでのコードを含めます。コードの最初のビットは、プロパティで構成されるクラスです。「Products」クラスには、それ自体を参照する ObservableCollection があることに注意してください。これが、ネストされたノードを構築する方法だと思います。つまり、リスト内のリストです。
2 番目のコードは、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 オブジェクトは、ノード レベルの数に関係なく拡張できる柔軟性を備えている必要があります。
お時間をいただき、誠にありがとうございました。
*********編集 2012/04/26 14:37 ******************
私のプロジェクト コードをダウンロードするには、以下のリンクを見つけてください (これにはツリービュー コードのみが含まれます)。2 レベルを超えてノードを作成できない理由を確認するために、誰かがそれを見てもらえますか?
コードはユーザー HB MAAM から提供されました。「HB MAAM」今までお世話になりました!