2014-09-18 107 views
0

假設我有這樣的代碼:ObjectListView - 顯示陣列

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

乾杯!

回答

0

@Grammarian 所以在代碼環顧四周後,我注意到方面干將爲領域。但是,Generator.GenerateColumns似乎並未使用其名爲allProperties的第三個布爾參數。

所以我把這個快速代碼放在一起,果然,它工作。它似乎也不會導致任何錯誤,這很好。

這裏有一個要點:

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

注:這也需要您允許OLVColumnAttribute和OLVIgnoreAttribute被應用到各個領域。這很容易;)

乾杯!

0

不,這是不可能的。 OLV使用對指定項目類型的反思來收集所需的信息。如果您提供IEnumerable,它只會查看第一個項目的類型。

Generator沒有線索,不關心你的物品的實際情況。另外,在你提出的情況下,它沒有什麼意義,因爲每個結構之間元素的數量可能不同。

0

陣列中有多少物品? 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(); 

稱此爲GenerateColumns()後

+0

我(可惜)不得不添加一些代碼到Generator.GenerateColumns。我會在下面粘貼它。不過謝謝! – Warpten 2014-09-27 16:47:17