65.9K
CodeProject 正在变化。 阅读更多。
Home

TreeView 中的多表数据绑定

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (8投票s)

2006年4月9日

CPOL

2分钟阅读

viewsIcon

92635

downloadIcon

1499

此代码将演示在 TreeView 中的数据绑定。

Sample Image

引言

在撰写本文时,标准的 Windows Forms .NET TreeView 控件不支持像 ASP.NET TreeView 控件那样的数据绑定概念。因此,我们只能自己编写解决方案。此解决方案提供了一种标准化的方法,可以将数据绑定与 Windows Forms .NET TreeView 控件一起使用。此功能将使您能够快速开发出用户友好的方法来创建和查看复杂的数据信息。该解决方案包括数据绑定实现以及以下设计模式:外观模式、代理模式、单例模式。它还包括自定义的“规则”类,以便开发人员在设计时能够派生主键和外键数据点。这对于在 TreeView 发生更改时调整底层数据集至关重要。更新也在单独的异步线程上执行。我想提到的最后一项是,此类支持两个表数据集,一个主键表和一个外键表。

要求

以下是最初的需求

  1. DataSet 绑定到 TreeView,并将结果保存回 Microsoft Access 数据库。
  2. 设计解决方案,使其易于在不同的解决方案中重用该类。
  3. 将尽可能多的绑定逻辑封装在自定义解决方案中,并将其对 UI 开发人员隐藏。
  4. UI 开发人员几乎不需要编写任何代码来使 TreeView 与其下的 DataSet 保持同步。
  5. 提供一个示例,用于删除 TreeView 中的节点(通过右键单击上下文菜单),并使该删除操作自动反映在 DataSet 中。
  6. 提供一个示例,用于编辑 TreeView 中的节点(通过右键单击上下文菜单),并使 Text 属性更改自动反映在 DataSet 中。
  7. 提供一个示例,用于在 TreeView 中插入节点(通过右键单击上下文菜单),并使新节点自动反映在 DataSet 中。
  8. 支持在同一个 TreeView 内拖放 TreeNode 分支,并使关系自动反映在 DataSet 中。
  9. 支持跨多个 TreeView 控件拖放 TreeNode 分支,并使关系自动反映在目标 DataSet 以及源 DataSet 中。
  10. 提供一个示例,用于接受和拒绝对同一个 TreeView 控件所做的更改,使用户能够撤消其更改。
  11. 当将 TreeNode 分支拖放到目标 TreeView 上时,自动将更改提交到源和目标 DataSet

使用代码

附件中包含的 DataTreeView 允许在控件中重新排序 TreeNode。下面是 NudgeUp 方法的一个示例

Public Sub NudgeUp(ByVal node As TreeNode)
    Dim NewIndex As Integer = 0
    Dim NodeClone As TreeNode = Nothing
    If node.Parent Is Nothing Then Exit Sub
    Try

        If node Is Nothing Then Return
        If node.Index = 0 Then Return

        NewIndex = node.Index - 1
        NodeClone = CType(node.Clone(), TreeNode)
        node.Parent.Nodes.Insert(NewIndex, NodeClone)
        node.Parent.Nodes.Remove(node)
        ReOrderSiblings(NodeClone)
        NodeClone.TreeView.SelectedNode = NodeClone

    Catch ex As Exception
        Throw New Exception("Error occured: NudgeUp")
    End Try
End Sub 'NudgeUp

下面简要描述了 UI 开发人员如何使用外观设计模式删除行。

Private Sub OnDeleteNode(ByVal e As DataTreeView.EditType, ByVal ID As Integer)
    Try
        Select Case e
            Case DataTreeView.EditType.Foreign
                Dim facade As New Database.CarFacade
                facade.DeleteCar(ID)
            Case DataTreeView.EditType.Primary
                Dim facade As New Database.DealerFacade
                facade.DeleteDealer(ID)
        End Select
    Catch ex As Exception

    End Try
End Sub

其他贡献者

历史

  • 1.0.0.0:初始版本(2006年4月9日)
  • 1.0.0.1:次要更改(2006年4月9日)
© . All rights reserved.