Я подозреваю, что ваша проблема связана не с подключением, а с обеспечением соответствия категорий при удалении элемента в список.Вот краткий пример для демонстрации проблемы (начиная с пустого рисунка в Visio):
void Main()
{
//Run this code against a blank drawing in Visio
var vApp = MyExtensions.GetRunningVisio();
var vDoc = vApp.ActiveDocument;
var stencilDoc = vDoc.Application.Documents.OpenEx("wfctrl_m.vssx",
(short)Visio.VisOpenSaveArgs.visOpenRO
+ (short)Visio.VisOpenSaveArgs.visOpenDocked);
var vPag = vApp.ActivePage;
var diagramServices = vDoc.DiagramServicesEnabled;
vDoc.DiagramServicesEnabled = (int)Visio.VisDiagramServices.visServiceVersion140
+ (int)Visio.VisDiagramServices.visServiceVersion150;
var shpList = vPag.Drop(stencilDoc.Masters.ItemU["List box"], 2.25, 9.5);
var itemMaster = stencilDoc.Masters.ItemU["List box item"];
// Drop two items in - this works because the item
// shapes have the correct required categories ('Grid')
vPag.DropIntoList(itemMaster, shpList, 1);
vPag.DropIntoList(itemMaster, shpList, 1);
// Now set the list's required categories to someting else
shpList.CellsU["User.msvSDListRequiredCategories"].FormulaU = $"\"Bob\"";
// Note an error is thrown here because the list item being
// inserted does not contain the category 'Bob'
try
{
vPag.DropIntoList(itemMaster, shpList, 1);
}
catch (COMException ex) when (ex.ErrorCode == -2032465763)
{
//Inappropriate source object for this action.
Console.WriteLine($"{ex.Message} - check matching categories in List and ListItem shapes");
}
vDoc.DiagramServicesEnabled = diagramServices;
}
Вы, вероятно, должны написать быструю проверку, где вы читаете ячейку User.msvShapeCategories
в форме элемента, а затем проверьте, еслиони входят в число обязательных категорий в форме списка (User.msvSDListRequiredCategories
).См. Раздел « Управление членством в контейнере » этого поста: Пользовательские контейнеры, списки и выноски в Visio 2010 для получения дополнительной информации.
Просто добавьте, что если вы хотите соединить фигуры в списке, вы можете использовать свой метод, описанный выше, или что-то подобное, в зависимости от того, какой уровень контроля вам нужен:
var item = vPag.DropIntoList(itemMaster, shpList, 1);
var target = vPag.DrawRectangle(4, 9, 6, 7.5);
item.AutoConnect(target, Visio.VisAutoConnectDir.visAutoConnectDirNone);