2

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\" />";
    }
}

}

4

1 に答える 1

0

さて、データバインディングは、私が思っていたようには機能しないようです。

私の解決策は、詳細ビュー データ ソースの OnUpdate および OnInsert イベントに結び付けることでした。ツリーを変更する方法で項目が更新された場合、ツリービューのデータ ソースで明示的に DataBind を呼び出します。よりクリーンな方法が必要なようですが、見つかりません。

于 2010-04-08T13:19:50.023 に答える