在objectListView中为treeListView构建模型

时间:2014-07-28 15:32:25

标签: c# .net objectlistview

我一直在尝试为treeListView构建一个模型,但似乎无法为我的需求获得正确的结构。我是objectListView的新手,并查看了示例和食谱,但不确定如何正确构建我的模型。这是我的模型的简化版本:

我有一位家长可以打电话给他" A"。

有2列(名称,值)。 " A"将是父级的名称,值可以设置为" 1"。

" A"有两个孩子没有姓名,但都带有价值," 2"为第一个孩子和" 3"为第二个孩子。树在此时停止。

所以我们有这样的结构:

Name     Value

A        1

         2

         3

以下是设置treeListView的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TreeListViewTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.treeListView1.CanExpandGetter = delegate(object x) 
            { 
                return true; 
            };
            this.treeListView1.ChildrenGetter = delegate(object x) 
            {
                Contract contract = x as Contract;
                return contrat.Children;
            };

            column1.AspectGetter = delegate(object x)
            {
                if(x is Contract)
                {
                    return ((Contract)x).Name;
                }
                else
                {
                    return " ";
                }
            };

            column2.AspectGetter = delegate(object x)
            {
                if(x is Contract)
                {
                    return ((Contract)x).Value;
                }
                else
                {
                    Double d = (Double)x;
                    return d.ToString();
                }
            };

            this.treeListView1.AddObject(new Contract("A", 1));

        }

        private void treeListView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }

    public class Contract
    {
        public string Name { get; set;}
        public Double Value { get; set; }
        public List<Double> Children {get; set;}

        public Contract(string name, Double value)
        {
            Name = name;
            Value = value;
            Children = new List<Double>();
            Children.Add(2);
            Children.Add(3);
        }
    }
}

如何阻止儿童使用扩展符号(+)因为他们不是父母而无法扩展?

1 个答案:

答案 0 :(得分:2)

  

什么是AspectName和AspectGetter?   您必须告诉列,从何处获取数据。您可以将列的AspectName属性设置为模型对象属性的名称,也可以使用AspectGetter委托来完全控制列中的内容。

AspectName示例

您可以在VS设计器中设置方面名称,也可以手动设置,如下所示:

// this would tell the column to get the content from the property named "Name"
olvColumn1.AspectName = "Name";

AspectGetter示例

我们在此示例中附加了一个匿名方法,您也可以使用具有匹配签名的方法名称。

// this lets you handle the model object directly
olvColumn1.AspectGetter = delegate(object rowObject) {
    // check if that is the expected model type
    if (rowObject is MyObject) {
        // just return the value of "Name" in this simple case
        return ((MyObject)rowObject).Name;
    } else {
        return "";
    }
};
  

我没有意识到孩子可能与父母不同。我将如何构建它。关于你如何拥有一个不同的父母和孩子,我有点困惑。

只需在ChildrenGetter中返回任何类型的List。使用AspectName,ObjectListView只是尝试查找具有给定名称的属性。使用Aspectgetter,您无论如何都可以手动处理内容,并可以从行中检查模型的类型。

  

如何阻止儿童使用扩展符号(+)因为他们不是父母而无法扩展?

你必须检查对象是否真的有孩子。如果是这样的话,只返回CanExpandGetter中的true。例如:

this.treeListView1.CanExpandGetter = delegate(object x) { 
    if (rowObject is MyObject) {
        return (((MyObject)x).Children.Count > 0);
    } else {
        return false;
    }
};