1

我有一个使用内容控件生成 Open XML 文档的应用程序。

要创建一个新的内容控件,我使用 Interop 和方法ContentControls.Add。此方法返回添加的内容控件的实例。

我有一些逻辑可以保存内容控件的 id 以供以后引用,但是在某些计算机中我遇到了一个奇怪的问题。

当我访问刚刚创建的Content Control的ID属性时,它返回一个带有数字id的字符串,问题是当这个值太大时,我保存文档后,如果我查看document.xml中的生成的文档,<w:id/>元素的<w:sdtPr/>元素有一个负值,即我从Id生成控件的属性中得到的值的有符号等价物。

例如:

var contentControl = ContentControls.Add(...);
var contentControlId = contentControl.ID;
// the value of contentControlId is "3440157266"

如果我保存文档并在包资源管理器中打开它,Id内容控件的值为“-854810030”而不是“3440157266”。

我发现是这样的:

((int)uint.Parse("3440157266")).ToString()  returns "-854810030"

知道为什么会这样吗?这个问题很难复制,因为我不控制Id生成的控件,它Id是由互操作库自动生成的。

4

3 回答 3

1

当以 32 位二进制格式显示时,-854810030 和 3440157266 是一样的!

于 2010-12-23T02:52:51.623 回答
0

ContentControl.ID 属性的 MSDN 文档中提到了这个问题

当您在运行时获取 ID 属性值时,它会作为无符号值返回。但是,当保存为 Office Open XML 文件格式时,它会保存为带符号的值。如果您的解决方案尝试将编程返回的值映射到以文件格式保存的值,则必须检查从该属性获得的值的无符号和有符号版本。

正如 Claude Martel 提到的,-854810030 和 3440157266 是相同的。Int32您可以通过将 signed转换为 unsigned轻松检查这一点UInt32

var id = Convert.ToInt32("-854810030 ");
UInt32 uId = (uint) id;

Assert.AreEqual(3440157266, uId);
于 2015-09-03T13:56:38.153 回答
-1

我过去也遇到过同样类型的问题。ID 是不可靠的,因为它似乎不会永久存在。我所做的是存储内容控件的名称,.Tag以便以后可以访问它。

于 2010-07-04T23:04:51.743 回答