Почему не обновляется TreeView?
Я использую ASP.NET TreeView
на странице с пользовательским 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\" />";
}
}
}
1 ответ
Хорошо, кажется, что привязка данных не работает так, как я думал.
Мое решение состояло в том, чтобы связать события OnUpdate и OnInsert для моего источника данных подробного просмотра - когда элемент обновляется способом, который изменит дерево, я вызываю DataBind явно для источника данных древовидного представления. Кажется, должен быть более чистый путь, но я не могу его найти.