C# 如何显示来自MongoDB的映射类,包括树视图中的额外元素?
我有一个类映射到MongoDB文档,该文档表示车辆刷新的条目。以下是该类的外观,以供参考:C# 如何显示来自MongoDB的映射类,包括树视图中的额外元素?,c#,winforms,mongodb,treeview,C#,Winforms,Mongodb,Treeview,我有一个类映射到MongoDB文档,该文档表示车辆刷新的条目。以下是该类的外观,以供参考: public class VehicleEntry { [BsonElement("@Date")] [BsonDefaultValue("")] public String Date { get; set; } [BsonElement("@Vin")] [BsonDefaultValue("")] public String Vin { get; se
public class VehicleEntry
{
[BsonElement("@Date")]
[BsonDefaultValue("")]
public String Date { get; set; }
[BsonElement("@Vin")]
[BsonDefaultValue("")]
public String Vin { get; set; }
[BsonElement("PostFlashDTCs")]
[BsonDefaultValue("0")]
public String PostFlashDTCs { get; set; }
[BsonElement("PreFlashDTCs")]
[BsonDefaultValue("0")]
public String PreFlashDTCs { get; set; }
[BsonElement("UserName")]
[BsonDefaultValue("")]
public String UserName { get; set; }
[BsonExtraElements]
public BsonDocument ExtraElements { get; set; }
}
我想把它显示在树视图中,但是我很难,因为我必须考虑多个元素类型以及不确定的嵌套量(这就是为什么我相信这里的树视图是好的)。我确信这将需要递归,但我不确定如何使用它和循环属性
我自我回答这个问题是为了帮助任何偶然发现它的未来用户,但我当然愿意接受建议或替代方法。反射命名空间可用于迭代VehicleEntry对象中的各个属性。假设每个VehicleEntry都是它自己的节点,以该节点为标题,我们可以这样循环:
private void DisplayVehiclesForTreeView(List<VehicleEntry> vehicles)
{
// Loop through each vehicle
foreach (VehicleEntry vehicle in vehicles)
{
// Make node by VehicleEntry
TreeNode vehNode = new TreeNode("VehicleEntry");
foreach (PropertyInfo propertyInfo in vehicle.GetType().GetProperties())
{
if (propertyInfo.CanRead)
{
object val = propertyInfo.GetValue(vehicle, null);
if (val is string)
{
vehNode.Nodes.Add(new TreeNode(propertyInfo.Name + ": " + val));
}
else if (val is BsonDocument)
{
vehNode.Nodes.Add(GetNodeForDocument((BsonDocument)val, propertyInfo.Name));
}
}
}
// Add node to tree view
treeView1.Nodes.Add(vehNode);
}
}
我们知道的另一种情况是,文档将具有字符串、嵌套文档或数组,并且我们会适当地处理每种情况。字符串的显示方式与其他字符串相同,文档和数组文档以递归方式迭代,最后都分解为一个字符串。下面是一个屏幕截图
反射命名空间可用于迭代VehicleEntry对象中的各个属性。假设每个VehicleEntry都是它自己的节点,以该节点为标题,我们可以这样循环:
private void DisplayVehiclesForTreeView(List<VehicleEntry> vehicles)
{
// Loop through each vehicle
foreach (VehicleEntry vehicle in vehicles)
{
// Make node by VehicleEntry
TreeNode vehNode = new TreeNode("VehicleEntry");
foreach (PropertyInfo propertyInfo in vehicle.GetType().GetProperties())
{
if (propertyInfo.CanRead)
{
object val = propertyInfo.GetValue(vehicle, null);
if (val is string)
{
vehNode.Nodes.Add(new TreeNode(propertyInfo.Name + ": " + val));
}
else if (val is BsonDocument)
{
vehNode.Nodes.Add(GetNodeForDocument((BsonDocument)val, propertyInfo.Name));
}
}
}
// Add node to tree view
treeView1.Nodes.Add(vehNode);
}
}
我们知道的另一种情况是,文档将具有字符串、嵌套文档或数组,并且我们会适当地处理每种情况。字符串的显示方式与其他字符串相同,文档和数组文档以递归方式迭代,最后都分解为一个字符串。下面是一个屏幕截图