2009-12-22 4 views
1

J'ai étendu treeview, treenode et nodetype afin que je puisse avoir des nœuds personnalisés. Certains nœuds possèdent des boutons d'image leur permettant d'ajouter un nœud enfant ou de supprimer le nœud. Je ne peux pas gérer les événements de mes boutons.Puis-je ajouter des boutons avec des événements à un treeNode personnalisé?

Public Class ContentTreeView 
Inherits TreeView 

Public Event OnAddChild(ByVal sender As Object, ByVal e As EventArgs) 
Public Event OnDelete(ByVal sender As Object, ByVal e As EventArgs) 

Private _AddImageURL As String = String.Empty 
Private _DeleteImageURL As String = String.Empty 

Public Property AddImageURL() As String 
    Get 
     Return _AddImageURL 
    End Get 
    Set(ByVal value As String) 
     _AddImageURL = value 
    End Set 
End Property 

Public Property DeleteImageURL() As String 
    Get 
     Return _DeleteImageURL 
    End Get 
    Set(ByVal value As String) 
     _DeleteImageURL = value 
    End Set 
End Property 

Protected Overrides Function CreateNode() As TreeNode 
    Dim retval As ContentTreeNode = New ContentTreeNode(AddImageURL, DeleteImageURL) 
    AddHandler retval.OnAddChild, AddressOf ContentNode_AddChild 
    AddHandler retval.OnDelete, AddressOf ContentNode_Delete 
    Return retval 
End Function 

Protected Sub ContentNode_AddChild(ByVal sender As Object, ByVal e As EventArgs) 
    RaiseEvent OnAddChild(Nothing, Nothing) 
End Sub 
Protected Sub ContentNode_Delete(ByVal sender As Object, ByVal e As EventArgs) 
    RaiseEvent OnDelete(Nothing, Nothing) 
End Sub 

Public Class ContentTreeNode 
    Inherits TreeNode 

    Public Event OnAddChild(ByVal sender As Object, ByVal e As EventArgs) 
    Public Event OnDelete(ByVal sender As Object, ByVal e As EventArgs) 

    Private _AddImageURL As String = String.Empty 
    Private _DeleteImageURL As String = String.Empty 

    Private btnAddChild As ImageButton 
    Private btnDelete As ImageButton 

    Public Sub New(ByVal AddImageURL_ As String, ByVal DeleteImageURL_ As String) 
     _AddImageURL = AddImageURL_ 
     _DeleteImageURL = DeleteImageURL_ 
    End Sub 

    Public Property AddImageURL() As String 
     Get 
      Return _AddImageURL 
     End Get 
     Set(ByVal value As String) 
      _AddImageURL = value 
     End Set 
    End Property 

    Public Property DeleteImageURL() As String 
     Get 
      Return _DeleteImageURL 
     End Get 
     Set(ByVal value As String) 
      _DeleteImageURL = value 
     End Set 
    End Property 

    Protected Overrides Sub RenderPreText(ByVal writer As HtmlTextWriter) 
    End Sub 

    Protected Overrides Sub RenderPostText(ByVal writer As HtmlTextWriter) 
     CreateChildControls() 
     If GetTreeNodeType() <> ContentTreeNodeTypes.Root Then 
      btnAddChild.RenderControl(writer) 
      If GetTreeNodeType() <> ContentTreeNodeTypes.Category Then 
       btnDelete.RenderControl(writer) 
      End If 
     End If 
    End Sub 

    Private Function GetTreeNodeType() As TreeNodeTypes 
     Dim leaf As TreeNodeTypes = TreeNodeTypes.Leaf 
     If ((Me.Depth = 0) AndAlso (Me.ChildNodes.Count > 0)) Then 
      Return ContentTreeNodeTypes.Root 
     End If 
     If Me.Depth = 1 Then 
      Return ContentTreeNodeTypes.Category 
     End If 
     If ((Me.ChildNodes.Count <= 0) AndAlso Not Me.PopulateOnDemand) Then 
      Return leaf 
     End If 
     Return ContentTreeNodeTypes.Parent 
    End Function 

    Protected Sub CreateChildControls() 
     'Controls.Clear() 

     '***Creat Add Button*** 
     btnAddChild = New ImageButton() 
     btnAddChild.ID = "btnAddChild" 
     btnAddChild.ImageUrl = AddImageURL 
     btnAddChild.ToolTip = "Add Child" 
     AddHandler btnAddChild.Click, AddressOf btnAddChild_Click 

     '***Create DeleteButton*** 
     btnDelete = New ImageButton() 
     btnDelete.ID = "btnDelete" 
     btnDelete.ImageUrl = DeleteImageURL() 
     btnDelete.ToolTip = "Delete Page" 
     AddHandler btnDelete.Click, AddressOf btnDelete_Click 

     ''***Add Controls*** 
     'Me.Controls.Add(btnAddChild) 
     'Me.Controls.Add(btnDelete) 
    End Sub 

    Protected Sub btnAddChild_Click(ByVal sender As Object, ByVal e As EventArgs) 
     RaiseEvent OnAddChild(Nothing, Nothing) 
    End Sub 
    Protected Sub btnDelete_Click(ByVal sender As Object, ByVal e As EventArgs) 
     RaiseEvent OnDelete(Nothing, Nothing) 
    End Sub 


    Public Enum ContentTreeNodeTypes 
     All = 7 
     Leaf = 4 
     None = 0 
     Parent = 2 
     Root = 1 
     Category = 3 
    End Enum 
End Class 

End Class

1) Puis-je mettre en œuvre quelque chose comme IPostBackEventHandler? 2) Est-ce possible puisque treeNode n'est pas un control/webcontrol?

Toute aide est appréciée ... Merci !!!

Répondre

0

Après avoir lu ce post. J'ai décidé d'utiliser la solution suivante. D'abord, je changé ma méthode CreateChildControls à:

 Protected Sub CreateChildControls() 
     Dim page As Page = HttpContext.Current.CurrentHandler 
     Dim csm As ClientScriptManager = page.ClientScript 
     Dim control As WebControl = page.Master.FindControl(_ContainerID).FindControl(_ContentTreeViewID) 

     '***Creat Add Button*** 
     btnAddChild = New ImageButton() 
     btnAddChild.ID = "btnAddChild" 
     btnAddChild.ImageUrl = AddImageURL 
     btnAddChild.ToolTip = "Add Child"    
     btnAddChild.Attributes.Add("onClick", csm.GetPostBackEventReference(control, String.Format("{0}:{1}", Me.Value, "Add"))) 

     '***Create DeleteButton*** 
     btnDelete = New ImageButton() 
     btnDelete.ID = "btnDelete" 
     btnDelete.ImageUrl = DeleteImageURL() 
     btnDelete.ToolTip = "Delete Page" 
     btnDelete.Attributes.Add("onClick", csm.GetPostBackEventReference(control, String.Format("{0}:{1}", Me.Value, "Delete"))) 
    End Sub 

Alors j'ai dû mettre en œuvre IPostBackEventHandler dans l'arborescence personnalisée pour gérer les événements postback. Peut-être pas la meilleure solution, mais cela fonctionne bien avec les arguments d'événements personnalisés.

0

Je pense que le problème est lié à la synchronisation, ce qui signifie que les contrôles enfants sont ajoutés tard dans le ASP.Net page lifecycle pour l'événement à exécuter.

Cela pourrait résoudre le problème:

  1. Compose toute la structure de l'arbre le plus tôt possible, par exemple dans l'événement Init de la page.
  2. Ajoutez l'enfant ImageButton au constructeur du ContentTreeNode.

Sinon, vous pouvez utiliser un menu contextuel javascript afin que vous ne auriez pas besoin d'ajouter des contrôles-enfant au TreeNode ...

+0

Je pense que vous avez peut-être raison, mais puisque les codes sont ajoutés/créés quand databound je ne peux pas vraiment faire grand-chose à ce sujet. – Mike

Questions connexes