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クエリを使用してデータを引き出しています。ただし、GrandChildrenを別のコントロール(Telerikグリッド)に表示したいと思います。

リストビューセルに新しいXMLDataSourceを作成しました。これにより、子のxPAth(コードに追加したもの、以下を参照)と目的のグリッドからデータが取得されます。グリッドは、そのDataSourceIDとしてXMLDataSourceを持つように設定されています。

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選択イベントが発生したときにトリガーされないためだと思います。

代わりに、別のクエリステートメントでデータをロードする必要がありますか、それともかなり単純なものを見落としていますか?

これは私が今しばらく困惑していたので、どんな助けでも大歓迎です:)

ありがとう。

アップデート:

2番目のXMLDataSourceのXPath部分を設定しようとして、選択コードに2番目のlinqクエリを追加しようとしましたが、これにより別のエラーが発生します。コード:

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 + WhereSelectEnumerableIterator1 2[System.Xml.Linq.XElement,<>f__AnonymousType3[System.String]]'に無効なトークンがあります。

新しい行にコメントを付けると、再び機能するようになります。

私はまだこれに対する解決策を見つけることを望んでいます。xPathを動的に構築することは、これを達成するための優れた方法であると想像しましたが、明らかにそれは失敗です。ここに何が見えないのですか?

4

1 に答える 1

0

新しいXMLDataSourceを追加し、それをlistsSource_Selectingイベント内にロードすることで、回避策を見つけました。

以前にこれを試しましたが、今回はListViewにフィードするLINQクエリの上にコードを配置しました。それはもうエラーをスローしません。

于 2012-08-29T05:16:50.933 に答える