2009-12-22 111 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

相关问题