1

I try to expand multiple lists in my tree structure.

Let's say I have the following classes. I have the class Product, which contains a list with its children. This is my actual tree structure.

    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;
    }
}

This part works great so far, but how can I expand the articles list in the same tree? I can't get this part working.

Should look something like:

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

My CanExpandGetter and ChildrenGetter are very basic currently

            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;

        };

Update

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

I found a solution if anyone is interested:

My product class has a list of objects:

    class Product
{
    int prodID;
    string prodName;

    List<object> childItems;

    ...
}

Now I can add every type of objects or other lists to this object-list, for example:

            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);

The structure looks like the following:

rootProduct
------WorkingProcess
-----------Article1
-----------Article2
------SubProduct1
------SubProduct2

Now we only need to change the CanExpandGetter and ChildrenGetter:

            // when the node can be expanded

tlvProduktStruktur.CanExpandGetter = delegate (object 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>();

        };

Now you should get the expected result.

  • I am not sure what your issue is, but maybe take a look at the OLV examples, specifically the file explorer view. It should be similar to what you try to do (Folder (Product) can contain a mix of sub folders (more products) and files (articles)). – Rev Jun 10 '16 at 12:55
  • Just some constructive feedback: When posting a question, try to be as specific as possible (and make sure you have done due diligence on your side first). Stuff like "I can't get this part working." is too vague and doesn't indicate how it is not working. Also you mention "Should look something like:" but you are not indicating what you are currently getting. Also if you have found the answer, don't append it in your question, post it separately as an answer to your question and then mark it as your answer. Just for future reference to assist you on StackOverflow :-) – Dandré Jul 09 '16 at 17:51
  • Thank you for your recommendation, I will keep that in mind. – user3515431 Jul 14 '16 at 14:22

0 Answers0