Почему мой TreeView не обновляется? - PullRequest
2 голосов
/ 05 апреля 2010

Я использую 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 Ответ

0 голосов
/ 08 апреля 2010

Хорошо, похоже, привязка данных не работает так, как я думал.

Мое решение состояло в том, чтобы связать события OnUpdate и OnInsert для моего источника данных подробного просмотра - когда элемент обновляется способом, который изменит дерево, я явно вызываю DataBind для источника данных древовидного представления. Кажется, должен быть более чистый путь, но я не могу его найти.

...