Считать значения ячеек PinX, PinY ShapeSheet из текущего выбранного Shape: Visio, C # COM Interop - PullRequest
0 голосов
/ 23 марта 2011

Я пытаюсь установить значения PinX и PinY для текущей выбранной фигуры в Visio на клавиатуре, например, [Ctrl] + [G]. Цель этого усилия состоит в том, чтобы программно перетащить фигуру на чертеж Visio на основе координат булавки текущей выбранной фигуры. Я использую C # и Microsoft.Office.Interop.Visio API для этого. Я использую .NET 4.0 (mscorlib.dll - версия 4.0.30319.1).

Пока у меня есть этот код:

Application myApp; // the reference to the Visio Application instance, which is passed into this class via constructor
Shape currShape; // a global variable for this class

//... down to the method in question
void app_KeyUp(int KeyCode, int KeyButtonState, ref bool CancelDefault)
{
    currShape = myApp.ActiveWindow.Selection[0];
    String xCoord = currShape.get_Cells("PinX").Formula;
    String yCoord = currShape.get_Cells("PinY").Formula;

    //handle keyboard events here
    //...
}

Этот код вызывает исключение COMExec; после исследования выясняется, что, хотя myApp.ActiveWindow.Selection имеет элемент [0] (его единственный элемент, если выбрана только одна фигура), я не могу фактически сохранить этот элемент в currShape. Я не знаю, почему это так. Как ни странно, COMException не вызывает остановки программы. Программа выходит из метода при попытке назначить currShape, но выполнение продолжается.

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

Этот код:

public void test()
        {
            currShape = myApp.ActiveWindow.Selection[0];
            String x = currShape.Shapes[1].get_Cells("PinX").Formula;
            currShape.Shapes[1].get_Cells("PinX").FormulaForce = "5";
        }

вызвало это исключение:

System.Runtime.InteropServices.COMException was unhandled
  Message="\n\nInvalid selection identifier."
  Source="Microsoft Visio"
  ErrorCode=-2032465753
  StackTrace:
       at Microsoft.Office.Interop.Visio.SelectionClass.get_Item(Int32 Index)
       at WindowsFormsApplication4.Handler.test() in C:\Users\pvs5x\Documents\Visual Studio 2008\Projects\ACCESS(1)\Handler.cs:line 91
       at WindowsFormsApplication4.Form3.changeColorToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Users\pvs5x\Documents\Visual Studio 2008\Projects\ACCESS(1)\OpenSafetyCase.cs:line 355
       at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
       at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
       at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
       at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
       at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
       at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
       at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
       at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ToolStrip.WndProc(Message& m)
       at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at WindowsFormsApplication4.Program.Main() in C:\Users\pvs5x\Documents\Visual Studio 2008\Projects\ACCESS(1)\Program.cs:line 20
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Я понятия не имею, что означает "Неверный идентификатор выбора", и поиск в Google дает только эту тему, предназначенную для Visual Basic, а не для C #.

Мои два вопроса:
(1) Что здесь не так?
(2) Как правильно получить доступ к выбранной в данный момент форме для такого рода манипуляций?

Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 03 апреля 2011

Интересно, связана ли проблема с индексом коллекции Selection.

Попробуйте:

currShape = myApp.ActiveWindow.Selection.Cast<Shape>().FirstOrDefault() Не забудьте добавить ссылку на библиотеку Linq с помощью using System.Linq;.

0 голосов
/ 05 апреля 2011

Оказывается, мне нужно было получить доступ к [1] ​​вместо [0], например,

currShape = myApp.ActiveWindow.Selection[1];

, поскольку Visio начинает нумерацию объектов с 1. Несмотря на то, что Watch в Visual Studio на myApp.ActiveWindow.Selection имел только один объект в [0], мне пришлось обращаться к нему с помощью [1].

0 голосов
/ 29 марта 2011

В прошлом у меня были проблемы с выбором фигур в Visio.Я решил это, создав объект Selection и затем применив метод Select .Я не уверен, поможет ли это вам.

Также вы можете сделать кросс-пост на VisGuy.com Вот где специалисты по программированию Visio.

...