C# 如何在Visio中以编程方式将里程碑拖放到块时间线上
我正在尝试使用Visio2010 COM互操作系统以编程方式创建时间线和标记。我的代码基于Chris Castillo的两篇博文(,),这是我能找到的关于如何做到这一点的唯一半完整示例。然而,他的博客(从2004年开始)似乎并不正常。里程碑与时间线没有真正的联系,更新它们的日期并不能让它们移动到正确的位置 有什么建议或修正吗C# 如何在Visio中以编程方式将里程碑拖放到块时间线上,c#,vb.net,office-interop,visio,C#,Vb.net,Office Interop,Visio,我正在尝试使用Visio2010 COM互操作系统以编程方式创建时间线和标记。我的代码基于Chris Castillo的两篇博文(,),这是我能找到的关于如何做到这一点的唯一半完整示例。然而,他的博客(从2004年开始)似乎并不正常。里程碑与时间线没有真正的联系,更新它们的日期并不能让它们移动到正确的位置 有什么建议或修正吗 Imports Microsoft.Office.Interop.Visio Imports System.Diagnostics.CodeAnalysis Imports
Imports Microsoft.Office.Interop.Visio
Imports System.Diagnostics.CodeAnalysis
Imports System.Runtime.InteropServices
在Visio2010上运行Chris针对内置模板(“TIMELN_M.VSS”)和模板的代码时,我发现它工作得非常好。但是,如果使用空白文档在内置模具上运行,则不会显示“说明”和“日期形状”数据字段。这两个字段的可见性取决于中的用户单元格(“User.visTLShowProps”),该单元格由加载项添加或在删除其中一个主控项时添加 标准模板包含两个调用DocumentCreated和DocumentOpened插件中的功能,或者添加两个用于打开和关闭上述值的其他用户单元格,或者它们存在于模板中。在任何情况下,如果未使用原始模板,则不会将其添加到文档形状表中 这意味着您需要自己切换该值。例如(快速VBA示例): 当然,您也可以将这些“推送”单元格添加到ShapeSheet中自己的文档模板中:
User.visTLShowPropsOn = SETF(GetRef(User.visTLShowProps),1)
User.visTLShowPropsOff = SETF(GetRef(User.visTLShowProps),0)
如果这不能解决您的问题,最后一点是,您是否使用了不同的或派生的模具(“Timeline Shapes.vss”)?因此我找到了一个以编程方式将@JohnGoldsmith链接到的visio对象添加到相关问题的方法,并找到了一种更好的创建模具和页面的方法,而且它正在工作
Dim VisioApp As New Application
Dim myDoc As Document = VisioApp.Documents.Add("Timeline.vst")
Dim myPage As Page = myDoc.Pages.Item(1)
Dim TimelineStencilName As String = "TIMELN_M.VSS"
Dim TimelineStencilDoc As Document
For Each Doc As Document In VisioApp.Documents
If Doc.Name = TimelineStencilName Then
TimelineStencilDoc = Doc
Exit For
End If
Next
Dim TimelineMaster As Master =
TimelineStencilDoc.Masters.ItemU("Block timeline")
Dim MilestoneMaster As Master =
TimelineStencilDoc.Masters.ItemU("Line milestone")
Dim theTimeline As Shape
Dim theMilestone As Shape
theTimeline = myPage.Drop(TimelineMaster, 5.610236, 5.511811)
theTimeline.CellsU("User.visBeginDate").FormulaU = _
VisioApp.ConvertResult(
"1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
theTimeline.CellsU("User.visEndDate").FormulaU = _
VisioApp.ConvertResult(
"12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
theMilestone = myPage.Drop( _
MilestoneMaster, _
5.610236, 5.511811)
theMilestone.CellsU("User.visMilestoneDate").FormulaU = _
VisioApp.ConvertResult(
"10/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
谢谢你的帮助,约翰。当您运行Chris的代码并运行时,它是来自一个独立的应用程序,还是来自某种VBA控制台中的Visio?我将时间线模板更改为“TIMELN_M.VSS”,但仍然得到相同的结果。我觉得它们是一样的。另外,我是否可以将Dim myDoc更改为Document=visiapp.Documents。添加(“”)以加载时间线文档而不是空白文档?对于所有正在努力解决这些问题的人,下面是关于启用ShapeSheets的开发人员模式的说明
User.visTLShowPropsOn = SETF(GetRef(User.visTLShowProps),1)
User.visTLShowPropsOff = SETF(GetRef(User.visTLShowProps),0)
Dim VisioApp As New Application
Dim myDoc As Document = VisioApp.Documents.Add("Timeline.vst")
Dim myPage As Page = myDoc.Pages.Item(1)
Dim TimelineStencilName As String = "TIMELN_M.VSS"
Dim TimelineStencilDoc As Document
For Each Doc As Document In VisioApp.Documents
If Doc.Name = TimelineStencilName Then
TimelineStencilDoc = Doc
Exit For
End If
Next
Dim TimelineMaster As Master =
TimelineStencilDoc.Masters.ItemU("Block timeline")
Dim MilestoneMaster As Master =
TimelineStencilDoc.Masters.ItemU("Line milestone")
Dim theTimeline As Shape
Dim theMilestone As Shape
theTimeline = myPage.Drop(TimelineMaster, 5.610236, 5.511811)
theTimeline.CellsU("User.visBeginDate").FormulaU = _
VisioApp.ConvertResult(
"1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
theTimeline.CellsU("User.visEndDate").FormulaU = _
VisioApp.ConvertResult(
"12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)
theMilestone = myPage.Drop( _
MilestoneMaster, _
5.610236, 5.511811)
theMilestone.CellsU("User.visMilestoneDate").FormulaU = _
VisioApp.ConvertResult(
"10/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches)