【问题标题】:Can I add buttons with events to a custom treeNode?我可以将带有事件的按钮添加到自定义树节点吗?
【发布时间】:2009-12-23 02:01:58
【问题描述】:

我扩展了树视图、树节点和节点类型,因此我可以拥有自定义节点。某些节点上有图像按钮,允许它们添加子节点或删除节点。我无法处理按钮中的任何事件。

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 不是控件/网络控件,这可能吗?

任何帮助表示赞赏...谢谢!!!

【问题讨论】:

    标签: asp.net vb.net custom-controls


    【解决方案1】:

    我认为问题与时间有关,这意味着将子控件添加到 ASP.Net page lifecycle 的后期以执行事件。

    这可能会解决问题:

    1. 尽早组合整个树结构,例如在页面的Init 事件中。
    2. 在 ContentTreeNode 的构造函数中追加子 ImageButton

    或者,您可以使用 javascript 上下文菜单,这样您就不需要将任何子控件附加到 TreeNode...

    【讨论】:

    • 我认为你可能是对的,但由于树节点是在数据绑定时添加/创建的,所以我真的无能为力。
    【解决方案2】:

    读完这个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 来处理回发事件。也许不是最好的解决方案,但它适用于自定义事件参数。

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多