如何为ObjectListView创建动态模型

时间:2016-02-26 09:52:32

标签: c# objectlistview

我搜索了几个小时但是我的编程方法错了或者我没有正确的搜索想法......

很久以前,我发现ObjectListView是普通ListView的一个很好的替代品。我当前项目中的问题:

我没有静态模型类。我有很多不同种类的物品。每种对象都有不同的属性。在我的ObjectListView中,我想显示对象的名称及其属性,给定类型的每个对象的一行。 (对于一种Object,属性是相同的)

对于我的ObjectListView模型,我尝试使用Mini-example(使用" num"和" txt" as 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的文本。

有什么想法解决这个问题?是否有另一种方法可以使用ObjectListView将List的元素(如Object.Attributes)显示为列?

提前谢谢。

好的,谢谢Klaus,在我的脑海中按照你的想法再次搜索特殊的对象,ObjectListView指向了AspectGetterDelegates

我找到了第一次使用的解决方案: 添加以下AspectGetter Delegate,ObjectListView显示我动态生成的属性的信息:

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

如果某人有相同的问题,这里有两个有用的方法来设置和获取ExpandoObjects的属性:

    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;
    }

2 个答案:

答案 0 :(得分:1)

我也是ObjectListView的用户并且发现它非常好,但最近我有类似的问题,我有这样的动态对象。事实上,在我的情况下,我根本不知道代码中的属性名称,这只来自数据,我有一个复杂的问题,就是必须压缩父子层次结构中的数据。

我的问题在于:Flattern child/parent data with unknown number of columns

我的解决方案是使用OLV的变体,即DataListView(似乎不是通过NuGet提供,而是从OLV网站下载http://objectlistview.sourceforge.net/cs/download.html

然后,一旦我在Dynamic对象中获得了数据(就像你有的那样),我就将其转换为DataTable,我可以绑定到DataListView

我的数据存储在:

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 :(得分:0)

我认为你的问题是你有很多不同种类的物品&#34;。 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);