TreeView
カスタムのページでASP.NET を使用していますXmlDataSource
。ユーザーがツリーのノードをクリックすると、DetailsView
ポップアップが表示され、基になるオブジェクトに関する一連の情報が編集されます。これはすべて正常に機能し、基になるオブジェクトはバックグラウンド オブジェクト管理クラスで更新されます。ただし、TreeView
ディスプレイを更新していません。すぐに(私はそれを望んでいます)、またはページ全体を再読み込みします(これは、私が必要とする最小限の有用なレベルです)。サブクラス化XmlDataSource
が不十分ですか?本当にわかりません。誰かが私を良い方向に向けることができますか?
マークアップは次のようになります (チャフは削除されています)。
<data:DefinitionDataSource runat="server" ID="DefinitionTreeSource" RootDefinitionID="uri:1"></data:DefinitionDataSource>
<asp:TreeView ID="TreeView" runat="server" DataSourceID="DefinitionTreeSource">
<DataBindings>
<asp:TreeNodeBinding DataMember="definition" TextField="name" ValueField="id" />
</DataBindings>
</asp:TreeView>
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
DataKeyNames="Id" DataSourceID="DefinitionSource" DefaultMode="Edit">
<Fields>
<asp:BoundField DataField="Name" HeaderText="Name" HeaderStyle-Wrap="false" SortExpression="Name" />
<asp:CommandField ShowCancelButton="False" ShowInsertButton="True" ShowEditButton="True"
ButtonType="Button" />
</Fields>
</asp:DetailsView>
コードは次のようになりDefinitionTreeSource
ます。
public class DefinitionDataSource : XmlDataSource
{
public string RootDefinitionID
{
get
{
if (ViewState["RootDefinitionID"] != null)
return ViewState["RootDefinitionID"] as String;
return null;
}
set
{
if (!Object.Equals(ViewState["RootDefinitionID"], value))
{
ViewState["RootDefinitionID"] = value;
DataBind();
}
}
}
public DefinitionDataSource() { }
public override void DataBind()
{
base.DataBind();
setData();
}
private void setData()
{
String defXML = "<?xml version=\"1.0\" ?>";
Test.Management.TestManager.Definition root =
Test.Management.TestManager.Definition.GetDefinitionById(RootDefinitionID);
if (root != null)
this.Data = defXML + root.ToXMLString();
else
this.Data = defXML + "<definition id=\"null\" name=\"Set Root Node\" />";
}
}
}