1

ツリー構造で複数のリストを展開しようとしています。

次のクラスがあるとしましょう。子を持つリストを含むクラス Product があります。これは私の実際のツリー構造です。

    class Product
{
    int prodID;
    string prodName;

    List<Product> prodChildren;
    List<Article> articleList;

    //maybe further list...

    public int ProdID
    {
        get { return prodID;}
        set{prodID = value;}
    }

    public string ProdName
    {
        get { return prodName;}
        set {prodName = value;}
    }

    public Product(int id, string name)
    {
        ProdID = id;
        ProdName = name;

        prodChildren = new List<Product>();
        articleList = new List<Article>();
    }

    //...
    //addProdChildren
    //...
    //addArticles
}

 class SalesArticle
{
    int articleNumber;
    string articleName;

    public int ArticleNumber
    {
        get
        {
            return articleNumber;
        }

        set
        {
            articleNumber = value;
        }
    }

    public string ArticleName
    {
        get
        {
            return articleName;
        }

        set
        {
            articleName = value;
        }
    }

    public SalesArticle(int no, string name)
    {
        ArticleNumber = no;
        ArticleName = name;
    }
}

この部分は今のところ問題なく機能していますが、同じツリー内の記事リストを展開するにはどうすればよいですか? 私はこの部分を働かせることができません。

次のようになります。

[product1]
---------[product2]
---------[product3]
--------------[article1]
--------------[article2]
--------------[article3]
--------------[article4]
---------[product4]
--------------[product5]
----------------------[articleX]
----------------------[articleX]
----------------------[articleX]
----------------------[articleX]

私の CanExpandGetter と ChildrenGetter は現在非常に基本的です

            tlvProduktStruktur.CanExpandGetter = delegate (object x) { return (x is Product); };

        tlvProduktStruktur.ChildrenGetter = delegate (object x) 
        {
            if (((Product)x).ProduktChildren.Count > 0)
                return ((Product)x).prodChildren;
            else
                return null;

        };

アップデート

------------------------------------------------------

誰かが興味を持っている場合、解決策を見つけました:

私の製品クラスにはオブジェクトのリストがあります:

    class Product
{
    int prodID;
    string prodName;

    List<object> childItems;

    ...
}

これで、すべてのタイプのオブジェクトまたはその他のリストをこのオブジェクト リストに追加できます。次に例を示します。

            Product rootProduct = new Product(1, "root");

        Article artikel1 = new Article();
        Article artikel2 = new Article();

        //this root product has a working process which contains a list of articles
        WorkingProcess wp = new WorkingProcess();
        wp.add(artikel1);
        wp.add(artikel2);

        childItems.Add(wp);

        //let's assume the root product has also two children
        Product p1 = new Product(2, "sub product 1");
        Product p2 = new Product(3, "sub product 2");

        rootProduct.childItems.Add(p1);
        rootProduct.childItems.Add(p2);

構造は次のようになります。

rootProduct
-  -  - 作業工程
-  -  -  -  - -第1条
-----------第2条
------SubProduct1
------SubProduct2

CanExpandGetter と ChildrenGetter を変更するだけです。

            // when the node can be expanded

tlvProduktStruktur.CanExpandGetter = デリゲート (オブジェクト x) {

            //if the product has child items (working process and/or child products) show it as expandable
            if (x is Product)
                if (((Product)x).ChildItems.Count > 0)
                    return true;

            //if the working process has articles, show it as expandable
            if (x is WorkingProcess)
                if (((WorkingProcess)x).ArticleList.Count > 0)
                    return true;

            return false;

        };


        tlvProduktStruktur.ChildrenGetter = delegate (object x) {

//check the type and expand its children

            //show the child items (working process and/or child products) of the current product
            if (x is Product)
                if (((Product)x).ChildItems.Count > 0)
                {
                    return ((Product)x).ChildItems;
                }

            //show the articles of the working process
            if (x is WorkingProcess)
                if (((WorkingProcess)x).ArticleList.Count > 0)
                    return ((WorkingProcess)x).ArticleList;

            return new List<object>();

        };

これで、期待どおりの結果が得られるはずです。

4

0 に答える 0