如我的问题所述,
我有一个XML文件输出如下:
<cme Type="Object" Class="cme">
<sId Type="String">1</sId>
<conc Type="Double">18,6511073619</conc>
</cme>
<cme Type="Object" Class="cme">
<sId Type="String">2</sId>
<conc Type="Double">18,3226889524</conc>
</cme>
<cme Type="Object" Class="cme">
<sId Type="String">3</sId>
<conc Type="Double">4,7920021996</conc>
</cme>....
我在Visual Studio中创建了一个新表单,并添加了以下代码:
cmDataSet.ReadXml(filePath,XmlReadMode.InferSchema);
cmDataGrid.DataSource = cmDataSet;
cmDataGrid.AutoGenerateColumns = true;
cmDataGrid.DataMember = "cme"; <-- Parent Node
但是当显示表单时,行数与计数匹配, 通过这种方式,单元格用属性值填充,而不是实际值:
Object cme
Object cme
Object cme
Object cme
如何跳过被评估的属性以仅显示实际值?
答案 0 :(得分:1)
我相信您需要为xml文件创建xsd架构。并将cmDataSet.ReadXmlSchema
调用添加到代码中:
cmDataSet.ReadXmlSchema(xsdFilePath);
cmDataSet.ReadXml(filePath, XmlReadMode.InferSchema);
cmDataGrid.DataSource = cmDataSet;
cmDataGrid.AutoGenerateColumns = false;
cmDataGrid.DataMember = "cme"; <-- Parent Node
您需要架构,因为目前数据集将包含3个DataTables:cme
,sId
和conc
。这不是你想要的。
实际上,如果xml文件没有架构,那么它与使用“尖括号分隔文本”一样好,易于使用。
另一种方法是使用LINQ to XML并构造匿名对象(或创建强类型对象并映射到它),它将代表您的数据网格行:
var doc = XDocument.Load(filePath);
var rows = doc.Root.Elements("cme")
.Select(e => new
{
cId = e.Element("sId").Value,
conc = e.Element("conc").Value
});
cmDataGrid.DataSource = rows.ToList();
cmDataGrid.AutoGenerateColumns = true;
使用LINQ投影是一种快速简便的数据显示方式,但在实施“添加/更新/编辑行”方案时可能会浪费大量时间。