我正在尝试使用
IEdmEnumeratorVariable5::SetVar
根据用户输入将某些文件卡变量更新为Windows窗体.我的代码执行,没有错误消息,文件已签出并重新签入,并将相应的注释添加到历史记录中;但是卡上的变量不会更新.
我已经通过在运行时逐步执行代码验证所有变量都填充了正确的(如预期的)数据. SetVar程序都顺利完成,但数据卡上的变量不会改变值 – 即使手动刷新文件夹视图也没有效果.
以下是我的代码.
这是一个加载项应用程序,使用VS Community 2015在VB中编写为类库项目,目标框架为.NET 4.0.
努力使这个问题更简洁;紧接着下面我只包含了设置变量工作的代码片段,然后我还包含了更多代码,以便您可以根据需要获得整个图片.
只是冰山一角 :
这是设置变量工作的代码:
Dim UserManager As IEdmUserMgr5 = .SourceVault Dim User As IEdmUser5 = UserManager.GetLoggedInUser CardComment = UserComment & CardComment CardDate = Today().ToString("yyMMdd",Globalization.CultureInfo.InvariantCulture) CardBy = User.Name CardDisposition = UserDisposition CardVariables.SetVar(DispositionVariable,"@",CardDisposition) CardVariables.SetVar(CommentVariable,CardComment) CardVariables.SetVar(ByVariable,CardBy) CardVariables.SetVar(DateVariable,CardDate) CardVariables.Flush()
更广泛的东西:
类模块级变量:
Private Structure CommandInfo Dim SourceVault As IEdmVault11 Dim SourceCommand As EdmCmd Dim SourceSelection As System.Array Dim TargetTemplate As System.String Dim VerifiedPaths As List(Of String) End Structure Private ReceivedCommand As CommandInfo
OnCmd程序(调用者):
Public Sub OnCmd(ByRef poCmd As EdmCmd,ByRef ppoData As System.Array) Implements IEdmAddIn5.OnCmd Dim CommandToRun As MenuCommand Try With ReceivedCommand .SourceVault = poCmd.mpoVault .SourceCommand = poCmd .SourceSelection = ppoData 'Get the command structure for the command ID Select Case poCmd.meCmdType Case EdmCmdType.EdmCmd_Menu CommandToRun = AvailableCommands(.SourceCommand.mlCmdID) Case EdmCmdType.EdmCmd_CardButton Select Case True Case poCmd.mbsComment.ToString.ToUpper.Contains("DISPOSITION") DispositionRequest() Case Else : Exit Sub End Select Case Else : Exit Sub End Select '...... (End Try,End Sub,Etc.)
DispositionRequest程序(被调用者):
Private Sub DispositionRequest() Dim UserDisposition As String Using Disposition As New DispositionForm With Disposition If Not .ShowDialog() = System.Windows.Forms.DialogResult.OK Then Exit Sub Select Case True Case .Approve.Checked UserDisposition = "Approved" Case .Reject.Checked UserDisposition = "Rejected" Case Else : Exit Sub End Select End With End Using Dim UserComment As String Using Explanation As New DispositionExplanation With Explanation If Not .ShowDialog() = System.Windows.Forms.DialogResult.OK Then Exit Sub If .ListView1.Items.Count > 0 Then 'do some stuff not relevant to this question... End If UserComment = .Comments.Text End With End Using 'This next procedure just gets a list of paths from ReceivedCommand.SourceSelection - which is just the ppoData argument from the OnCmd procedure - see code block above! Dim RequestPaths As List(Of String) = GetSelectedFilePaths() For Each Path As String In RequestPaths With ReceivedCommand Dim RequestFile As IEdmFile5 = .SourceVault.GetFileFromPath(Path) Dim ParentFolder As IEdmFolder6 = .SourceVault.GetFolderFromPath(System.IO.Path.GetDirectoryName(Path)) Dim UnlockLater As Boolean = False If Not RequestFile.IsLocked Then UnlockLater = True RequestFile.LockFile(ParentFolder.ID,.SourceCommand.mlParentWnd,CInt(EdmLockFlag.EdmLock_Simple)) End If Dim CardVariables As IEdmEnumeratorVariable5 = RequestFile.GetEnumeratorVariable 'We allow users to re-disposition a request so we want to keep any previous disposition information so it is not lost Dim CardComment As String = String.Empty Dim CardBy As String = String.Empty Dim CardDate As String = String.Empty Dim CardDisposition As String = String.Empty Dim Success As Boolean Const CommentVariable As String = "DispComm" Const ByVariable As String = "DisposedBy" Const DateVariable As String = "DisposedDate" Const DispositionVariable As String = "Disposition" Success = CardVariables.GetVar(DispositionVariable,CardDisposition) If Success Then Success = CardVariables.GetVar(CommentVariable,CardComment) If Success Then Success = CardVariables.GetVar(ByVariable,CardBy) If Success Then Success = CardVariables.GetVar(DateVariable,CardDate) If Success Then CardComment = "Previously dispositioned as: """ & CardDisposition & """ by: " & CardBy & " on: " & CardDate & vbNewLine & "---------Previous disposition explanation---------" & vbNewLine & CardComment End If Dim UserManager As IEdmUserMgr5 = .SourceVault Dim User As IEdmUser5 = UserManager.GetLoggedInUser CardComment = UserComment & CardComment CardDate = Today().ToString("yyMMdd",Globalization.CultureInfo.InvariantCulture) CardBy = User.Name CardDisposition = UserDisposition CardVariables.SetVar(DispositionVariable,CardDisposition) CardVariables.SetVar(CommentVariable,CardComment) CardVariables.SetVar(ByVariable,CardBy) CardVariables.SetVar(DateVariable,CardDate) CardVariables.Flush() If UnlockLater Then RequestFile.UnlockFile(lParentWnd:= .SourceCommand.mlParentWnd,bsComment:="Dispositioned as " & CardDisposition,lEdmUnlockFlags:=0) .SourceVault.RefreshFolder(ParentFolder.LocalPath) End With Next End Sub
解决方法
从
the documentation开始:
bsCfgName : Name of configuration or layout to which to store the variable value; empty string for folders and file types that do not support configurations
我正在使用一个不支持配置的虚拟文件.
我看到一个使用虚拟文件的C示例并且它们正在传递空引用,所以我重读了文档并看到了上面的摘录,因此我将代码从“@”更改为String.Empty以获取mboconfiguration参数,现在它正在工作!
CardVariables.SetVar(DispositionVariable,String.Empty,CardDate) CardVariables.Flush()