我一直在尝试为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);
}
}
}
如何阻止儿童使用扩展符号(+)因为他们不是父母而无法扩展?
答案 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;
}
};