0

我有一个类似于以下内容的 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__AnonymousType31[System.String]]' 的令牌无效。

评论新行让事情再次起作用。

我仍然希望为此找到解决方案。我认为动态构建 xPath 将是完成此任务的好方法,但显然这是行不通的。我在这里没有看到什么?

4

1 回答 1

0

我最终通过添加一个新的 XMLDataSource 并将其加载到 listsSource_Selecting 事件中找到了一种解决方法。

我之前尝试过这样做,但是这次将代码放在了提供 ListView 的 LINQ 查询之上。这不会再引发任何错误。

于 2012-08-29T05:16:50.933 回答