2010-04-05 4 views
2

사용자 정의 XmlDataSource이있는 페이지에서 ASP.NET TreeView을 사용하고 있습니다. 사용자가 트리의 노드를 클릭하면 DetailsView이 나타나 기본 객체에 대한 여러 가지 사항을 편집합니다. 이 모든 것이 제대로 작동하고 기본 객체가 내 백그라운드 객체 ​​관리 클래스에서 업데이트됩니다. 그러나 내 TreeView은 디스플레이를 업데이트하지 않습니다. 즉각적으로 (내가 원하는) 또는 전체 페이지를 다시로드 (최소한 필요한 유용한 수준)해야합니다. XmlDataSource을 하위 클래스로 하위 클래스 화합니까? 나는 정말로 모른다. 누구든지 좋은 방향으로 나를 가리킬 수 있습니까?왜 내 TreeView가 업데이트되지 않습니까?

마크 업이 같은 대한 보인다 (왕겨 제거) :

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

}

+0

page_load는 어떤 모양입니까? –

+0

지금은 아무 것도 없습니다. 결국에는 거기에 몇 가지 스타일을 조정할 것입니다 (tree.Font.Name, tree.ShowLines 등)하지만 지금은 코드 비하인드가 빈 함수 만 포함합니다. – Brendan

+0

데이터 원본에서 캐싱을 사용하지 않으면 전체 페이지를 다시로드 할 때 노드 이름의 변경 사항이 표시됩니다. 그러나 detailsview가 업데이트를 거쳐 변경 사항을 표시하지는 않습니다. – Brendan

답변

0

을 좋아 잘은 데이터 바인딩 그냥 아무튼 보인다 나는 그것이 어떻게 생각했는지 꽤 일하지 않는다.

내 솔루션은 내 detailsview 데이터 소스에 대한 OnUpdate 및 OnInsert 이벤트를 묶는 것이 었습니다. 트리를 변경하는 방식으로 항목이 업데이트되면 TreeView의 데이터 소스에서 DataBind를 명시 적으로 호출합니다. 깨끗한 방법이 있어야하지만 찾을 수없는 것 같습니다.

관련 문제