2015-10-15 9 views
2

Привет я создаю Формы из visio2013 с помощью C# .Теперь мне нужно заполнить форму с некоторыми цветами, используя C# я попытался следующие коды, но ничего не имеет смысла :(:(Заполнение формы Visio с цветом в C#

Visio.Cell cqellname; 
      cqellname = shape.get_CellsSRC(
      (short)Visio.VisSectionIndices.visSectionObject, 
      (short)Visio.VisRowIndices.visRowFill, 
      (short)Visio.VisCellIndices.visFillBkgnd); 
      cqellname.FormulaU = "rgb(255,0,0)"; 

выше код выдает ошибку, как Охраняемый Cell.

shape.get_CellsSRC((short)Visio.VisSectionIndices.visSectionObject, 
     (short)Visio.VisRowIndices.visRowFill, 
    (short)Visio.VisCellIndices.visFillBkgnd).FormulaForceU = "RGB(" + R + "," + G + "," + B + ")"; 

попытался выше, не выбрасывает никаких исключений, но ничего не изменилось в форме.

я уже пробовал это решение from stackoverflow и его тоже не работает

я могу в состоянии видеть значение, присвоенное мной в ShapeSheet FillForeGnd и FillBkGnd, но форма не заполнение цветом, который я дал.

enter image description here

Может ли один скажите, пожалуйста, как это сделать .. ??

ответ

2

Как я уже говорил в ответе выше (который вы помечены как не полезно) вы ориентируетесь неправильная формы.

Теперь, когда вы изменили свой вопрос, чтобы включить более подробную информацию, ясно, с какой формой вы имеете дело.

Форма, на которую вы нацеливаетесь, выглядит как «свернутый подпроцесс» из трафарета «Основные формы BPMN». Это групповая форма, а верхний уровень не имеет геометрии, поэтому изменение цвета, как вы делаете в своем вопросе, не имеет визуальных изменений. Чтобы решить эту проблему, вам нужно найти подформу, которая используется для отображения фона. Бывает, что в этом конкретном хозяине субформа, содержащая заполнение, которое вам нужно настроить, имеет индекс, который больше, чем родительский, поэтому вы можете использовать его в коде. Форма не содержит каких-либо других четких функций (например, ячейки пользователя), которые могли бы сделать лучшего кандидата, поэтому учтите, что этот метод предназначен именно для этой конкретной формы.

Учитывая, что вы, кажется, выполняете справедливую работу с этим трафаретом, мой подход состоял в том, чтобы создать копию шаблона и внести некоторые изменения в мастера, чтобы сделать такое взаимодействие немного легче, но я надеюсь, что на этот вопрос ответит следующий код.

Пожалуйста, отметьте это как ответ, если это так.

public void OnCheckFillBPMN() 
{ 
    Color fillColor = Color.FromArgb(1, 255, 0, 0); 
    CollapsedSubProcessFill(this.Application.ActiveWindow.Selection.PrimaryItem, fillColor); 
} 

private void CollapsedSubProcessFill(Visio.Shape vShpIn, Color fillColor) 
{ 
    if (vShpIn != null && vShpIn.Master != null && vShpIn.Master.NameU.StartsWith("Collapsed Sub-Process")) 
    { 
     //The sub-shape that provides the fill colour in 
     //the 'Collapsed Sub-Process' master is the first index 
     //after the group shape. 
     //If you want to use a different method to locate the 
     //correct sub-shape then do that here. 
     var targetSubShpId = vShpIn.ID + 1; 
     var targetShp = TryGetShapeInCollection(vShpIn.Shapes, targetSubShpId); 
     if (targetShp != null) 
     { 
      var targetCell = targetShp.get_CellsSRC(
       (short)Visio.VisSectionIndices.visSectionObject, 
       (short)Visio.VisRowIndices.visRowFill, 
       (short)Visio.VisCellIndices.visFillForegnd); 
      targetCell.FormulaU = "RGB(" + fillColor.R 
            + ',' + fillColor.G 
            + ',' + fillColor.B + ')'; 
     } 
    } 
} 


private Visio.Shape TryGetShapeInCollection(Visio.Shapes vShps, int shpId) 
{ 
    try 
    { 
     if (vShps != null) 
     { 
      var targetShp = vShps.ItemFromID[shpId]; 
      return targetShp; 
     } 
    } 
    catch (System.Runtime.InteropServices.COMException ex) 
    { 
     if (ex.ErrorCode == -2032465756) //Invalid sheet identifier 
     { 
      return null; 
     } 
    } 
    return null; 
} 
+0

Спасибо за ответ. внутрь. :) – Arshad

+0

Итак, в этом случае, если мне нужно заполнить задание, то это тоже такая же процедура ..? – Arshad

+0

Спасибо, что это работает .. !! Но что, если его нормальная форма как Task и т. Д., А не рухнувший подпроцесс .. ?? – Arshad

-1

Если FormulaForceU работает, но у вас нет визуального изменения, я предполагаю, что вы не устанавливаете правильную ячейку. Обычно вы устанавливаете ячейку FillForegnd (visFillForegnd), если нет другого набора шаблонов. Также обратите внимание, что (для Visio 2013+), если для параметра FillGradientEnabled установлено значение true, это переопределит сплошные цвета.

Последнее, что нужно иметь в виду, состоит в том, что у фигуры, на которую вы нацеливаетесь, не может быть геометрии, или может быть установлено, что ее ячейка NoFill установлена ​​в true, и действительно вы должны ориентироваться на дочерний элемент/подформу.

В любом случае вы должны crack open the ShapeSheet и посмотреть, в каком состоянии формы находится.

+0

Что есть в этой связи, которую вы поделились?Я ничего не нашел там – Arshad

+0

Это ссылка на объяснение того, что такое ShapeSheet, но теперь я понимаю, что вы человек с проблемой формы события, поэтому, я думаю, вы знаете, что это такое. Вы обнаружили, что вы нацелились на неправильную ячейку или это была другая проблема? – JohnGoldsmith

+0

Я пробовал все и ничего не работает :(: L ( – Arshad