此操作失败,因为在事件期间进行的一项或多项更改无效

时间:2014-05-27 08:07:14

标签: c# xml vsto powerpoint

我正在使用VS 2012中的c#创建PowerPoint 2010加载项。 我在每个演示文稿中插入一个XML文件。此XML包含一些重要的幻灯片相关数据,必须在打开新演示文稿后读取这些数据。我按以下方式添加自定义XML。

Office.CustomXMLPart xmlPart;

string xmlString = "<?xml version='1.0' ?>" +
                            "<data xmlns:c='charts'>" +
                                "<c:Chart>" +
                                    "<c:ChartType>MyChartType</c:ChartType>" +
                                    "<c:ChartID>" + pShape.Id + "</c:ChartID>" +
                                "</c:Chart>" +
                            "</data>";

xmlPart = presentation.CustomXMLParts.Add(xmlString, missing);

现在,每当新的演示文稿打开时,我都必须阅读此自定义XML,并检查ChartType = "MyChartType"是否正确。以下是AfterPresentationOpen事件的代码。

void pptAPP_AfterPresentationOpen(PowerPoint.Presentation Pres)
{
    foreach (PowerPoint.Shape shapeItem in Pres.Windows[1].Selection.SlideRange.Shapes)
    {
        if (shapeItem.HasChart == Office.MsoTriState.msoTrue)
        {
            **customXMLPart = Pres.CustomXMLParts[0]**; //My XML is at this index
            customXMLNode = customXMLPart.SelectSingleNode("//Chart/ChartType");
        }
    }
}

理论上说这应该可行。但是当我运行代码时,编译器给了我这个操作失败,因为在事件期间做出的一个或多个更改是无效的。 **行的异常。

更新 在使用Pres.CustomXMLParts[1]Pres.CustomXMLParts[2]等运行代码时,没有此类异常。

1 个答案:

答案 0 :(得分:1)

这是一篇旧帖子,但是我在google相同的错误消息时到了这里。 阅读这篇文章后,它打击了我,excel有使用1作为第一个索引的方式,而不是我们都知道和喜欢的基于零的索引:)。

因此,在您的更新中,您提到使用Pres.CustomXMLParts [1]和Pres.CustomXMLParts [2]运行代码可以正常工作,因为您使用的索引大于0。

您的图表数据应该位于其中一个部分。