C# MS项目-禁用资源

C# MS项目-禁用资源,c#,vb.net,vsto,ms-project,C#,Vb.net,Vsto,Ms Project,我正在创建Microsoft Project加载项。根据资源的自定义文本列(比如Text30)的值,我是否可以在尝试将资源分配给任务时禁用该资源的显示 因此,例如,如果一行的Text30值为Inactive,则项目文件用户不应将其分配给任务,但它仍应位于资源表中。在下面,第1行可以作为资源使用,而第2行在为任务分配资源时不会显示 在Rachel的相关问题的帮助下,我设法找到了一个解决办法。我添加了一个名为“活动状态”的文本列(Text30)。然后,使用Application.ProjectBef

我正在创建Microsoft Project加载项。根据资源的自定义文本列(比如Text30)的值,我是否可以在尝试将资源分配给任务时禁用该资源的显示

因此,例如,如果一行的Text30值为
Inactive
,则项目文件用户不应将其分配给任务,但它仍应位于资源表中。在下面,第1行可以作为资源使用,而第2行在为任务分配资源时不会显示


在Rachel的相关问题的帮助下,我设法找到了一个解决办法。我添加了一个名为“活动状态”的文本列(
Text30
)。然后,使用
Application.ProjectBeforeTaskChange
检查新值是否是具有value
Active
Text30
的资源。是指向MS Project事件的链接。代码如下:

Imports Microsoft.Office.Interop.MSProject

Private Sub Application_ProjectBeforeTaskChange(tsk As Task, Field As PjField, NewVal As Object, ByRef Cancel As Boolean) Handles Application.ProjectBeforeTaskChange

    CheckResourceValidity(NewVal, Cancel)

End Sub


Private Sub CheckResourceValidity(NewVal As Object, ByRef Cancel As Boolean)

    Dim res As Resource
    Dim newValList = NewVal.Split(",")

    If Not IsStartup(newValList) Then

        For Each splitNewVal In newValList
            ' currentProject is the currently active Project
            res = currentProject.Resources.Item(splitNewVal)

            If splitNewVal = res.Name Then

                If res.Text30 <> "Active" Then
                    MessageBox.Show("You are trying to assign an inactive resource to a task. Please choose an active resource.",
                                    "Assigning inactive resource", MessageBoxButtons.OK, MessageBoxIcon.Error)

                    Cancel = True
                End If

            End If
        Next

    End If

End Sub


' The event ProjectBeforeTaskChange is called when a .mpp file with data inside is opened
Private Function IsStartup(newValList As Object) As Boolean

    Dim res As Resource

    For Each x In newValList

        Try
            res = GlobalVariables.currentProject.ProjResources.Item(x)
        Catch ex As System.Runtime.InteropServices.COMException
            Return True
        End Try

    Next

    Return False

End Function
导入Microsoft.Office.Interop.MSProject
私有子应用程序_ProjectBeforeTaskChange(tsk作为任务,字段作为PjField,NewVal作为对象,ByRef Cancel作为布尔值)处理Application.ProjectBeforeTaskChange
CheckResourceValidity(新建、取消)
端接头
私有子CheckResourceValidity(NewVal作为对象,ByRef Cancel作为布尔值)
作为资源的Dim res
Dim newValList=NewVal.Split(“,”)
如果不是IsStartup(newValList),则
对于newValList中的每个splitNewVal
'currentProject是当前活动的项目
res=currentProject.Resources.Item(splitNewVal)
如果splitNewVal=res.Name,则
如果res.Text30处于“活动”状态,则
MessageBox.Show(“您正在尝试将非活动资源分配给任务。请选择活动资源。”,
“分配非活动资源”,MessageBoxButtons.OK,MessageBoxIcon.Error)
取消=真
如果结束
如果结束
下一个
如果结束
端接头
'打开包含数据的.mpp文件时,将调用事件ProjectBeforeTaskChange
私有函数IsStartup(newValList作为对象)作为布尔值
作为资源的Dim res
对于newValList中的每个x
尝试
res=GlobalVariables.currentProject.ProjResources.Item(x)
捕获例如System.Runtime.InteropServices.COMException
返回真值
结束尝试
下一个
返回错误
端函数
如果资源没有Text30值“Active”,则程序将不允许用户向任务添加资源

注意: 只有通过甘特图分配资源时,才会触发此事件。如果通过资源选项卡->分配资源进行分配,则不会触发事件。事件
projectbeforesignmentnew
将通过分配资源和甘特图触发。唯一的缺点是,我没有找到通过
projectbeforesignmentnew
事件访问正在更改的值的方法。您可以找到该事件。

简短的回答是否——不能逐个任务禁用资源。但是,此问题中显示了一个解决方案:。VBA代码很容易移植到vb.net。