我有一个类似于以下内容的 XML 文件:
<root>
<parent label="parent1">
<child label="child1">
<element1>data</element1>
<element2>data</element2>
...
<grandchildren>
<grandchild label="grandchild1">
<elementa>data</elementa>
<elementb>data</elementb>
</grandchild>
</grandchildren>
</child>
<child label="child2">
<element1>data</element1>
<element2>data</element2>
...
<grandchildren>
<grandchild label="grandchild2">
<elementa>data</elementa>
<elementb>data</elementb>
</grandchild>
</grandchildren>
</child>
</parent>
</root>
XML 用作树视图的数据源。用户可以在那里选择一个父级,父级的属性将显示在一个列表视图中(它使用 LINQdataview 作为数据源)。我正在使用 linq 查询提取数据。但是,我想在单独的控件(Telerik 网格)中显示 GrandChildren。
我在 listview 单元格中创建了一个新的 XMLDataSource,它将从孩子的 xPAth(我在代码中添加的内容,见下文)以及预期的网格中提取其数据。网格设置为将 XMLDataSource 作为其 DataSourceID。
这是我用来在 Selecting 事件中提取数据的代码:
protected void listsSource_Selecting(object sender, LinqDataSourceSelectEventArgs e) {
XElement rootElement = XElement.Load(MapPath(TreeSource.DataFile));
parentElement = rootElement.XPathSelectElement("//parent[@label='" + tvw.SelectedNode.Text + "']");
var query = from element in parentElement.DescendantsAndSelf("child")
select new {
element1 = element.Element("element1").Value,
element2 = element.Element("element1").Value,
xPathAddress = "//parent[@label='" + tvw.SelectedNode.Text + "']",
grandchildrenXPath = "//parent[@label='" + tvwMaterials.SelectedNode.Text + "']" + "/grandchildren"
};
e.Result = query;
}
这是来自 ASPX 的代码:
<td rowspan="7" style="border-style: solid; border-width: thin" align="center">
<telerik:RadGrid ID="gridRelatives" runat="server" DataSourceID="XmlRelatives" >
</telerik:RadGrid>
<asp:XmlDataSource ID="XmlRelatives" runat="server"
DataFile="~/XML/Data/relatives.xml" xPath='<%# Eval("grandchildrenPath") %>'></asp:XmlDataSource>
</td>
但是,这会导致“无法在数据源中的项目中找到任何可绑定属性”错误,我猜这是因为尝试动态加载 XML,导致它在 ListSource 选择事件触发时不会触发。
我应该改为在单独的查询语句中加载数据,还是我忽略了一些相当简单的事情?
任何帮助将不胜感激,因为这已经让我难倒了一段时间:)
谢谢。
更新:
尝试向选择代码添加第二个 linq 查询,以尝试设置第二个 XMLDataSource 的 XPath 部分,但这给了我另一个错误。代码:
var query2 = from element in parentElement.DescendantsAndSelf("child")
select new {
grandchildrenXPath = "//parent[@label='" + tvw.SelectedNode.Text + "']" + "/grandchildren"
};
myThickness.XPath = query2.ToString();
myThickness.DataBind();
错误:
'System.Linq.Enumerable+WhereSelectEnumerableIterator 2[System.Xml.Linq.XElement,<>f__AnonymousType3
1[System.String]]' 的令牌无效。
评论新行让事情再次起作用。
我仍然希望为此找到解决方案。我认为动态构建 xPath 将是完成此任务的好方法,但显然这是行不通的。我在这里没有看到什么?