2009-12-22 185 views
1

我擴展了treeview,treenode和nodetype,所以我可以定製節點。某些節點上有圖像按鈕,允許它們添加子節點或刪除節點。我無法處理來自按鈕的任何事件。我可以將事件按鈕添加到自定義treeNode嗎?

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 

末級

1)我可以實現類似IPostBackEventHandler? 2)這是可能的,因爲treeNode不是一個控制/網絡控制?

任何幫助表示讚賞...謝謝!

回答

0

閱讀本post後。我決定使用以下解決方案。首先,我改變了我的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 

然後我不得不實施IPostBackEventHandler在自定義樹視圖來處理回發事件。也許不是最好的解決方案,但它適用於自定義事件參數。

0

我認爲問題是時間相關的,這意味着子控件被添加到ASP.Net page lifecycle的後期,以便執行該事件。

這可能會解決問題:儘早,例如

  1. 撰寫整個樹結構在頁面的Init事件中。
  2. 在ContentTreeNode的構造函數中追加孩子ImageButton

另外,您也可以使用JavaScript上下文菜單,所以你不需要任何兒童控制追加到TreeNode ...

+0

我想你可能是對的,但由於treenodes是在數據綁定時添加/創建的,所以我無法對此做太多的瞭解。 – Mike 2009-12-22 18:03:38

相關問題