2016-02-26 93 views
2

我搜索了幾個小時,但無論是我的編程做法是錯誤的或我沒有正確的思想搜索動態模型...如何創建ObjectListView

地塊的時間前,我發現ObjectListView作爲一個很好的替代正常的ListView。我在當前項目中的問題:

我沒有靜態模型類。我有很多不同種類的物體。每種對象都有不同的屬性。在我的ObjectListView中,我想顯示對象的名稱及其屬性,每個給定類型的對象都有一行。 (對於一個樣的對象,屬性是相同的)

對於我ObjectListView的型號我嘗試以下小例子(使用「編號」和「TXT」作爲AspactName):

using System.Dynamic; 
[...] 
private void addItems() 
{ 
    dynamic expando = new ExpandoObject(); 
    expando.num = 1; 
    expando.txt = "Element"; 

    List<ExpandoObject> lst = new List<ExpandoObject>(); 
    lst.Add(expando); 
    olv.SetObjects(lst); 
} 

ObjectListView添加一行但不顯示屬性num和txt的文本。

任何想法來解決這個問題?有沒有另一種方法來顯示List的元素(如Object.Attributes)作爲使用ObjectListView的列?

預先感謝您。


好的,謝謝克勞斯,在我的腦海裏按照你的想法和特殊對象和ObjectListView再次搜索向我指出AspectGetterDelegates

我找到了解決方案的第一次工作: 添加以下AspectGetter代表中,ObjectListView顯示了我dynamicaly生成的屬性的信息:

olv.GetColumn(0).AspectGetter = delegate (dynamic er) { return er.Nummer; }; 
olv.GetColumn(1).AspectGetter = delegate (dynamic er) { return er.Text; }; 

如果有人有同樣的問題,這裏有來自防爆設置和獲取屬性兩個有用的方法pandoObjects:

public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue) 
    { 

     var expandoDict = expando as IDictionary<string, object>; 
     if (expandoDict.ContainsKey(propertyName)) 
      expandoDict[propertyName] = propertyValue; 
     else 
      expandoDict.Add(propertyName, propertyValue); 
    } 

    public static object GetProperty(ExpandoObject expando, string propertyName) 
    { 

     var expandoDict = expando as IDictionary<string, object>; 
     if (expandoDict.ContainsKey(propertyName)) 
      return expandoDict[propertyName]; 
     else 
      return null; 
    } 

回答

0

我也是ObjectListView的用戶覺得很不錯,但最近也有類似的問題我有這樣的動態物體。實際上,就我而言,我並不知道代碼中的所有屬性名稱,只是來自數據,而且我必須將父級子級別中的數據展平。

我的問題是在這裏:Flattern child/parent data with unknown number of columns

對我來說,解決方案是使用OLV這是DataListView的一個變種(似乎不是通過的NuGet可用的,但是是從OLV網站http://objectlistview.sourceforge.net/cs/download.html下載)

然後,一旦我在一個動態對象我的數據(如你),我則轉換成我可以綁定到DataListView

我的數據存儲在一個DataTable這樣的:

List<dynamic> allRecords = new List<dynamic>(); 
//Build my dynamic data here 

我轉換這一個DataTable:

private DataTable GetDataTableFromObject(List<dynamic> allRecords) 
{ 
    DataTable dt = new DataTable(); 
    foreach (dynamic record in allRecords) 
    { 
     DataRow dr = dt.NewRow(); 
     foreach (dynamic item in record) 
     { 
      var prop = (IDictionary<String, Object>)item; 
      if (!dt.Columns.Contains(prop["Column_name"].ToString())) //Column_Name = Property name 
      { 
       dt.Columns.Add(new DataColumn(prop["Column_name"].ToString())); 
      } 

      dr[prop["Column_name"].ToString()] = prop["Data"]; //Data = value 
     } 
     dt.Rows.Add(dr); 
    } 
} 

然後我把它添加到DataListView

this.dataListView1.DataSource = GetDataTableFromObject(allRecords); 
this.dataListView1.RebuildColumns(); 
+1

這看起來像一個不錯的選擇;至少有一點比我的解決方案更聰明;) – Daniel

+1

今天我還剩下幾分鐘,並嘗試了你的解決方案。它工作得很好,性能甚至更好一些(使用〜6300值插入更快0.05秒)。代碼更清晰,所以這是解決這個問題的解決方案。非常感謝! – Daniel

0

我認爲你的問題是你有一個「很多不同類型的對象」。 ObjectListView工作很好地像一個模型對象:

public class user 
{ 
    private string name; 
    private string address; 

    public user(string name , string address) 
    { 
     this.name = name; 
     this.address= address; 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    public string Address 
    { 
     get { return address; } 
     set { address = value; } 
    } 
} 

,那麼你可以使用objectlistview:

List<user> users = new List<user>(); 
users.Add(new user("Me", "address1"); 
users.Add(new user("You", "address2"); 
objectListView1.SetObjects(users); 
+0

「很多不同類型的對象」,是的,這正是這個問題,但我不能改變這個事實,這種對象是由用戶生成的... – Daniel

+0

你可以減少所有的對象到一個普通的對象,並擴大其他對象嗎?通過這種方式,你可以顯示,至少,共同領域...... –

+0

thx,減少所有對象是可能的,但我需要屬性的「特殊」字段 – Daniel