Открыть документ XML Проблема ContentControls с подписанными идентификаторами - PullRequest
1 голос
/ 22 апреля 2010

У меня есть приложение, которое генерирует документы Open XML с помощью Content Controls.

Для создания нового Content Control я использую Interop и метод ContentControls.Add.Этот метод возвращает экземпляр добавленного Контент Контроля.

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

Когда я получаю доступ к свойству 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 автоматически создается библиотеками Interop.

Ответы [ 3 ]

1 голос
/ 23 декабря 2010

При отображении в 32-битном двоичном формате значения -854810030 и 3440157266 одинаковы!

0 голосов
/ 03 сентября 2015

Эта проблема упоминается в документации MSDN свойства ContentControl.ID :

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

Как упоминал Клод Мартель, -854810030 и 3440157266 являются идентичными. Вы можете легко проверить это, приведя Int32 к неподписанному UInt32:

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

Assert.AreEqual(3440157266, uId);
0 голосов
/ 05 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...