gpt4 book ai didi

c# - 如何为 ObjectListView 创建动态模型

转载 作者:太空宇宙 更新时间:2023-11-03 12:50:47 25 4
gpt4 key购买 nike

我搜索了几个小时,但要么我的编程方法不对,要么我没有正确的搜索思路...

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

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

对于我的 ObjectListView 模型,我尝试了以下迷你示例(使用“num”和“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 添加了一个 Row 但不显示 Properties num 和 txt 的文本。

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

提前谢谢你。


好的,谢谢克劳斯,在我的脑海中遵循你的想法并再次搜索特殊对象和 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;
}

最佳答案

我也是 ObjectListView 的用户,觉得它非常好,但最近遇到了类似的问题,我有这样的动态对象。事实上,在我的例子中,我根本不知道代码中的所有属性名称,这仅来自数据,而且我不得不展平父子层次结构中的数据。

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

我的解决方案是使用 OLV 的变体,即 DataListView(似乎无法通过 NuGet 获得,但可以从 OLV 网站下载 http://objectlistview.sourceforge.net/cs/download.html)

然后,一旦我将数据存储在动态对象中(就像您一样),我便将其转换为可以绑定(bind)到 DataListView 的 DataTable

我的数据存储在:

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

我将其转换为数据表:

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);
}
return dt;
}

然后我将它添加到DataListView

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

关于c# - 如何为 ObjectListView 创建动态模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35648424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com