次のような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を動的に構築することは、これを達成するための優れた方法であると想像しましたが、明らかにそれは失敗です。ここに何が見えないのですか?