- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我搜索了几个小时,但要么我的编程方法不对,要么我没有正确的搜索思路...
很久以前,我发现 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/
我是一名优秀的程序员,十分优秀!