假设我有以下代码:
public sealed class MyStruct {
// ... snip
public uint[] ItemStatValue { get; set; }
// ... snip
}
// MainForm.cs
// ...
Generator.GenerateColumns(this.ContentListView, structure, true);
ContentListView.SetObjects(_records);
// ...是否有一种方法可以指示GenerateColumns将ItemStateValue属性的每个元素作为一个列单独处理,并适当地命名它们?("Item Stat Value 1“、"Item Stat Value 2”等)目前,它只对对象调用ToString(),从而返回System.Type.UInt32[]。不完全是我想要的。
我用的是http://www.codeproject.com/Articles/16009/A-Much-Easier-to-Use-ListView
干杯!
发布于 2014-10-12 16:33:20
@Grammarian -所以在查看代码之后,我注意到了字段的方面获取器。但是,Generator.GenerateColumns似乎没有使用它的第三个布尔参数allProperties。
所以我把这个快速代码拼凑在一起,果然,它起了作用。它似乎也不会引起任何错误,这是很好的。
这里有一个要点:
https://gist.github.com/Warpten/c792ad66ad20cc69a918
注意:这还需要允许将OLVColumnAttribute和OLVIgnoreAttribute应用于字段。(这很容易;)
干杯!
发布于 2014-09-19 06:58:04
不那是不可能的。OLV使用对指定项类型的反射来收集所需的信息。如果您提供了一个IEnumerable,它只会查看第一个项目的类型。
Generator没有任何线索,也不关心项目的实际实例。而且,在建议的情况下,这也没有多大意义,因为每个结构之间的元素数可能不同。
发布于 2014-09-25 07:16:55
数组中将有多少项?ListViews有固定的列数,即每一行都有相同的列数。
如果您知道会有20个可能的统计数据,只需生成列。
const int numberOfColumns = 20;
for (int i = 0; i < numberOfColumns; i++) {
var statIndex = i;
var column = new OLVColumn();
column.Name = "Stat" + i;
column.AspectGetter = delegate(object x) {
MyStruct myStruct = (MyStruct)x;
return statIndex < myStruct.ItemStatValue.Length ? (uint?)myStruct.ItemStatValue[statIndex] : null;
};
column.AspectToStringConverter = delegate(object x) {
uint? value = (uint?)x;
return value.HasValue ? String.Format("Stat value: {0}", value.Value) : String.Empty;
};
this.ContentListView.AllColumns.Add(column);
}
this.ContentListView.RebuildColumns();在GenerateColumns()之后调用它
https://stackoverflow.com/questions/25920491
复制相似问题