2010-04-22 47 views
1

我有一個應用程序生成帶有內容控件的Open XML文檔。使用簽名ID打開XML文檔ContentControls問題

創建一個新的內容控制我使用Interop和方法ContentControls.Add。此方法返回添加的內容控件的實例。

我有一些邏輯,保存內容控制的id以後引用它,但在一些計算機中,我一直有一個奇怪的問題。

當我訪問我剛創建的內容控件的ID屬性時,它返回一個帶有數字ID的字符串,問題是當這個值太大時,在我保存文檔後,如果我通過所生成的文檔中的document.xml<w:sdtPr/>元素的<w:id/>元素具有負值,這是從生成的控件的Id屬性獲得的值的已簽名等效項。

例如:

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

如果我保存文檔,並在Package Explorer中打開它,內容控件的Id是「-854810030」,而不是「3440157266」。

有什麼我想通了,是這樣的:

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

爲什麼發生這種情況的任何想法?此問題很難複製,因爲我不控制生成的控件的IdId是由Interop庫自動生成的。

回答

-1

我過去曾經遇到過類似的問題。身份證是不可靠的,因爲它似乎並不永久。我所做的是存儲內容控制的名稱.Tag,以便稍後可以訪問它。

1

以32位二進制格式顯示時,-854810030和3440157266是一樣的!

0

問題MSDN documentation of the ContentControl.ID Property中提到:

當你在運行時的ID屬性值,它會返回一個無符號值。但是,保存爲Office Open XML文件格式時,它將保存爲有符號值。如果您的解決方案試圖以編程方式將返回值映射到以文件格式保存的值,則必須檢查從此屬性獲取的值的無符號和有符號版本。

正如Claude Martel所述,-854810030和3440157266是ident。您可以通過將簽署的Int32轉換爲無符號的UInt32來輕鬆檢查:

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

Assert.AreEqual(3440157266, uId);