ObjectListView-显示数组

本文关键字:数组 显示 ObjectListView- | 更新日期: 2023-09-27 18:22:35

假设我有这样的代码:

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

干杯!

ObjectListView-显示数组

不,这是不可能的。OLV使用对指定项目类型的反映来收集所需的信息。如果你提供了一个IEnumerable,它只会查看第一个项目的类型。

Generator没有任何线索,也不关心您的项目的实际实例。此外,在您提出的情况下,这也没有多大意义,因为每个结构的元素数量可能不同。

数组中有多少项?ListView具有固定数量的列,即每行具有相同数量的列。

如果你知道会有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();

在GenerateColumes()之后调用此函数

@Grammarian因此,在查看了代码之后,我注意到字段的方面getter。然而,Generator.GenerateColumns似乎没有使用它的第三个布尔参数allProperties。

所以我把这个快速代码拼凑在一起,果不其然,它奏效了。它似乎也不会引起任何错误,这很好。

要点如下:

https://gist.github.com/Warpten/c792ad66ad20cc69a918

注意:这还需要允许OLVColumnAttribute和OLVIgnoreAttribute应用于字段。这很容易;)

干杯!