⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdlctrl.vb

📁 <Visual Basic 数据库开发实例精粹(第二版)>一书首先介绍了Visual Basic(简称VB)开发的技巧和重点技术
💻 VB
字号:
Module mdlCtrl

#Region "枚举定义"
  '消息类型,分为收到的消息和已发送的消息
  Enum MessageType
    MsgTypeReceive
    MsgTypeSend
  End Enum
  '视图类型,分为显示搜索结果和普通的按部门显示
  Enum ViewType
    vtSearch
    vtList
  End Enum
  '部门树中结点的类型,存于Tag信息中,
  '因为TypeId都>0,所以枚举类型的取值必须<=0
  Enum TreeItemType
    Root = 0
    Inbox = -1
    Outbox = -2
  End Enum
  '搜索面板的动作方向,显示或隐藏
  Enum SearchAction
    Show
    Hide
  End Enum
#End Region

#Region "TreeView控件的相关操作"

  '// -----------------------------------------------------------------------------
  '// <summary>
  '// 初始化部门树,加入根结点和收件箱与发件箱
  '// </summary>
  '// <param name="trv">TreeView对象</param>
  '// <remarks>
  '// </remarks>
  '// <history>
  '// 	[Tom]	2006-1-11	Created
  '// </history>
  '// -----------------------------------------------------------------------------
  Public Sub InitDeptTreeView(ByRef trv As TreeView)
    Dim i As Integer
    Dim Outbox, Sys, Inbox As TreeNode
    Dim RoleObj As New InfoProSysBusiness.Role

    trv.Nodes.Clear()

    '添加根节点
    Sys = New TreeNode("企业办公联系系统")
    Sys.Tag = TreeItemType.Root '通过Tag记录识别信息
    Sys.ImageIndex = 0
    trv.Nodes.Add(Sys)

    '添加根接点的一级子节点
    Inbox = New TreeNode("收件箱")
    Inbox.Tag = TreeItemType.Inbox
    Inbox.ImageIndex = 1
    Outbox = New TreeNode("发件箱")
    Outbox.Tag = TreeItemType.Outbox
    Outbox.ImageIndex = 2
    Sys.Nodes.Add(Inbox)
    Sys.Nodes.Add(Outbox)

    '获取所有的部门
    Dim node As TreeNode
    Dim dmRole As InfoProSysBusiness.RoleDataModel
    Dim RoleAry As New System.Collections.ArrayList
    RoleObj.GetAllRoles(RoleAry)
    For i = 0 To RoleAry.Count - 1
      dmRole = RoleAry(i)
      If dmRole.m_iRoleId <> LoginedUserInfo.m_iRoleID Then
        '添加Inbox的子节点
        node = New TreeNode(dmRole.m_szRoleName)
        node.Tag = dmRole.m_iRoleId '部门的Tag信息根据具体的RoleId而定
        node.ImageIndex = 5
        Inbox.Nodes.Add(node)

        '添加Outbox的子节点
        node = New TreeNode(dmRole.m_szRoleName)
        node.Tag = dmRole.m_iRoleId
        node.ImageIndex = 6
        Outbox.Nodes.Add(node)
      End If
    Next

    '展开根节点
    Sys.Expand()
    '展开Inbox节点
    Inbox.Expand()
    Outbox.Expand()
    trv.SelectedNode = Inbox

  End Sub

#End Region

#Region "ListView控件相关操作"
  '// -----------------------------------------------------------------------------
  '// <summary>
  '// 初始化信息列表的表头,根据msgType和Stat来订制其样式
  '// </summary>
  '// <param name="lsvInfo">TreeListView对象</param>
  '// <param name="msgType">消息类型,分为收到的消息还是已发送的消息</param>
  '// <param name="Stat">显示类型,正常列表显示或显示搜索结果</param>
  '// <remarks>
  '// </remarks>
  '// <history>
  '// 	[Tom]	2006-1-11	Created
  '// </history>
  '// -----------------------------------------------------------------------------
  Public Sub InitMsgListView(ByRef lsvInfo As TreeListView, _
                                ByVal msgType As MessageType, _
                                ByRef Stat As ViewType)
    With lsvInfo
      '清空ListView项和标题头
      .Items.Clear()
      .Columns.Clear()

      '记录当前listview所显示的是inbox 还是outbox
      .Tag = msgType

      '添加标题头
      .Columns.Add("信息号", -2, HorizontalAlignment.Left)


      If msgType = MessageType.MsgTypeSend Then
        .Columns.Add("收件部门", -2, HorizontalAlignment.Left)
      ElseIf msgType = MessageType.MsgTypeReceive Then
        .Columns.Add("发件部门", -2, HorizontalAlignment.Left)
      End If

      .Columns.Add("发件人", -2, HorizontalAlignment.Left)
      .Columns.Add("发件人电话", -2, HorizontalAlignment.Left)
      .Columns.Add("处理时限", -2, HorizontalAlignment.Left)
      .Columns.Add("发件时间", -2, HorizontalAlignment.Left)
      If Stat = ViewType.vtSearch Then
        .Columns.Add("回复部门", -2, HorizontalAlignment.Left)
        .Columns.Add("回复人", -2, HorizontalAlignment.Left)
        .Columns.Add("回复人电话", -2, HorizontalAlignment.Left)
        .Columns.Add("回复时间", -2, HorizontalAlignment.Left)
      End If

      .Refresh()
      '设置列的宽度
      If .View = View.Details Then
        .Columns(0).Width = .Width / 8
        .Columns(1).Width = .Width / 5.5
        .Columns(2).Width = .Width / 8.5
        .Columns(3).Width = .Width / 6
        .Columns(4).Width = .Width / 8
        .Columns(5).Width = .Width / 4
      End If

    End With

  End Sub

  Public Sub UpdateMsgListView(ByRef lsvInfo As TreeListView, _
                           ByVal msgType As MessageType, _
                           ByVal iDeptSend As Integer, _
                           ByVal iDeptReceive As Integer, _
                           Optional ByVal IsShowReply As Boolean = True)

    Dim MsgObj As New InfoProSysBusiness.Message

    '获取信息
    Dim Ary As New System.Collections.ArrayList
    MsgObj.GetConciseMsgList(Ary, iDeptSend, iDeptReceive, False)
    mdlCtrl.UpdateMsgListView(lsvInfo, msgType, Ary, IsShowReply)

  End Sub

  '// -----------------------------------------------------------------------------
  '// <summary>
  '// 将Ary中的信息数据添加到TreeListView中,并可设置是否显示回复信息
  '// </summary>
  '// <param name="lsvInfo">TreeListView对象</param>
  '// <param name="msgType">消息类型,指收到的消息还是已发送的消息</param>
  '// <param name="Ary">MessageDataModel对象数组</param>
  '// <param name="IsShowReply">是否显示回复的信息</param>
  '// <remarks>
  '// </remarks>
  '// <history>
  '// 	[Tom]	2006-1-11	Created
  '// </history>
  '// -----------------------------------------------------------------------------
  Public Sub UpdateMsgListView(ByRef lsvInfo As TreeListView, _
                                ByVal msgType As MessageType, _
                                ByVal Ary As ArrayList, _
                                Optional ByVal IsShowReply As Boolean = True)

    Dim MsgObj As New InfoProSysBusiness.Message

    Dim i As Integer
    Dim bShowPlusMinus As Boolean = False
    Dim lsvItem As TreeListViewItem
    Dim dmMsg As InfoProSysBusiness.MessageDataModel
    Dim szDeptName As String = ""

    lsvInfo.Items.Clear()
    For i = 0 To Ary.Count - 1
      dmMsg = Ary(i)

      '1) 添加一个TreeListViewItem到lsvInfo中
      lsvItem = New TreeListViewItem
      '  a) 根据msgType显示不同的部门和图标
      If msgType = MessageType.MsgTypeReceive Then
        szDeptName = dmMsg.m_szDeptSendName
        lsvItem.ImageIndex = 0
      ElseIf msgType = MessageType.MsgTypeSend Then
        szDeptName = dmMsg.m_szDeptReceiveName
        lsvItem.ImageIndex = 1
      End If
      '  b) 设置TreeListViewItem数据
      With lsvItem
        .Tag = dmMsg.m_iInfoID
        .SubItems(0).Text = i + 1
        .SubItems.Add(szDeptName)
        .SubItems.Add(dmMsg.m_szAddresserTrueName)
        .SubItems.Add(dmMsg.m_szAddresserTel)
        .SubItems.Add(dmMsg.m_dtProcTimeLimit.Date)
        .SubItems.Add(dmMsg.m_dtSendTime)
      End With
      '  c) 添加
      lsvInfo.Items.Add(lsvItem)

      '2) 根据IsShowReply决定是否显示回复信息
      If IsShowReply Then
        Dim j As Integer
        Dim dmReMsg As InfoProSysBusiness.MessageDataModel
        Dim ReAry As New System.Collections.ArrayList
        Dim iReSendDeptId As Integer
        '根据msgType来决定回复此信息的发送部门
        '如果当前显示的是收到的信息,那么回复此信息的只能是当前登录部门
        '如果当前显示的是已发送的信息,那么回复此信息的可以是任意部门
        If msgType = MessageType.MsgTypeReceive Then
          iReSendDeptId = LoginedUserInfo.m_iRoleID
        ElseIf msgType = MessageType.MsgTypeSend Then
          iReSendDeptId = 0
        End If
        MsgObj.GetConciseReplyMsgList(ReAry, iReSendDeptId, dmMsg.m_iDeptSendId, dmMsg.m_iInfoID)
        For j = 0 To ReAry.Count - 1
          dmReMsg = ReAry(j)
          '添加一个TreeListViewItem到lsvInfo中
          Dim sublsvItem As New TreeListViewItem
          '  a) 根据msgType显示不同的部门
          If msgType = MessageType.MsgTypeReceive Then
            szDeptName = dmReMsg.m_szDeptSendName
          ElseIf msgType = MessageType.MsgTypeSend Then
            szDeptName = dmReMsg.m_szDeptReceiveName
          End If
          sublsvItem.ImageIndex = 3
          '  b) 设置TreeListViewItem数据
          sublsvItem.Tag = dmReMsg.m_iInfoID
          sublsvItem.SubItems(0).Text = j + 1
          sublsvItem.SubItems.Add(szDeptName)
          sublsvItem.SubItems.Add(dmReMsg.m_szDeptSendName & " - " & dmReMsg.m_szAddresserTrueName)
          sublsvItem.SubItems.Add(dmReMsg.m_szAddresserTel)
          sublsvItem.SubItems.Add(dmReMsg.m_dtProcTimeLimit.Date)
          sublsvItem.SubItems.Add(dmReMsg.m_dtSendTime)
          '  c) 添加
          lsvItem.Items.Add(sublsvItem)
          bShowPlusMinus = True
        Next j
        '如果已经被回复过,则改为已回复的图标
        If ReAry.Count > 0 Then
          lsvItem.ImageIndex = 2
        End If

      End If

    Next i

    lsvInfo.ShowPlusMinus = bShowPlusMinus

  End Sub

  '// -----------------------------------------------------------------------------
  '// <summary>
  '// 将部门名称加入列表框中,同时可以设置一个选种的元素
  '// </summary>
  '// <param name="lsv">ListView对象</param>
  '// <param name="iCheckedDeptId">选种的部门ID</param>
  '// <param name="bShowCheckBox">是否显示复选框</param>
  '// <returns>成功返回空字符串,失败返回错误信息</returns>
  '// <remarks>
  '// </remarks>
  '// <history>
  '// 	[Tom]	2006-1-11	Created
  '// </history>
  '// -----------------------------------------------------------------------------
  Public Function AddDeptsToListView(ByRef lsv As ListView, _
                            ByVal iCheckedDeptId As Int16, _
                            Optional ByVal bShowCheckBox As Boolean = True) As String
    Dim i As Integer
    Dim ErrMsg As String = ""
    '1) 读取部门信息
    Dim ary As New System.Collections.ArrayList
    Dim deptObj As New InfoProSysBusiness.Role
    Dim lstItem As ListViewItem
    Dim dmRole As InfoProSysBusiness.RoleDataModel
    ErrMsg = deptObj.GetAllRoles(ary)
    If ErrMsg <> "" Then
      Return ErrMsg
    End If

    '2) 根据bShowCheckBox设置ListView是否显示复选框
    lsv.CheckBoxes = bShowCheckBox

    '3) 将所有的部门信息添加到ListView中,并选种iCheckedDeptId
    lsv.Items.Clear()
    For i = 0 To ary.Count - 1
      dmRole = ary(i)
      If dmRole.m_iRoleId <> LoginedUserInfo.m_iRoleID Then
        lstItem = New ListViewItem(dmRole.m_szRoleName)
        lstItem.Tag = dmRole.m_iRoleId
        lstItem.Checked = IIf(dmRole.m_iRoleId = iCheckedDeptId, True, False)
        lsv.Items.Add(lstItem)
      End If
    Next i

    Return ErrMsg

  End Function
#End Region

#Region "Combox/控件相关操作"

  '// -----------------------------------------------------------------------------
  '// <summary>
  '// 将部门名称加入下拉列表框中,同时可以设置一个选种的元素
  '// </summary>
  '// <param name="cbo">Combox对象</param>
  '// <param name="bIncludeLoginedDept">是否包括当前登录的部门</param>
  '// <param name="bShowAllDeptItem">是否显示“全部部门”项</param>
  '// <param name="iSelectedDeptId">选中的部门ID</param>
  '// <returns>成功返回空字符串,失败返回错误信息</returns>
  '// <remarks>
  '// </remarks>
  '// <history>
  '// 	[Tom]	2006-1-11	Created
  '// </history>
  '// -----------------------------------------------------------------------------
  Public Function AddDeptsToCombo(ByRef cbo As ComboBox, _
                                  Optional ByVal bIncludeLoginedDept As Boolean = False, _
                                  Optional ByVal bShowAllDeptItem As Boolean = False, _
                                  Optional ByVal iSelectedDeptId As Integer = -1) As String
    Dim i As Integer
    Dim ErrMsg As String = ""
    '1) 读取部门信息
    Dim deptObj As New InfoProSysBusiness.Role
    Dim dmDept As InfoProSysBusiness.RoleDataModel
    Dim Ary As New ArrayList
    ErrMsg = deptObj.GetAllRoles(Ary)
    If Ary.Count < 1 Then
      Return ErrMsg
    End If

    '2) 如果bIncludeLoginedDept为假,删除登录用户所在的部门
    If bIncludeLoginedDept = False Then
      For i = 0 To Ary.Count - 1
        dmDept = Ary(i)
        If dmDept.RoleId = LoginedUserInfo.m_iRoleID Then
          Ary.RemoveAt(i)
          Exit For
        End If
      Next
    End If

    '3) 如果bShowAllDeptItem为真,插入一个“所有部门”项
    If bShowAllDeptItem Then
      dmDept = New InfoProSysBusiness.RoleDataModel
      dmDept.m_iRoleId = 0
      dmDept.m_szRoleName = "所有部门"
      Ary.Insert(0, dmDept)
    End If

    '4) 绑定Ary 到 cbo
    cbo.DataSource = Ary
    cbo.DisplayMember = "RoleName"
    cbo.ValueMember = "RoleId"

    '5) 设置选中项
    cbo.SelectedValue = iSelectedDeptId

    Return ErrMsg

  End Function

 

#End Region


End Module

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -