1

コンテンツコントロールを使用してOpenXMLドキュメントを生成するアプリケーションがあります。

新しいコンテンツコントロールを作成するには、相互運用機能とメソッドを使用しますContentControls.Add。このメソッドは、追加されたコンテンツコントロールのインスタンスを返します。

コンテンツコントロールのIDを保存して後で参照するロジックがありますが、一部のコンピューターでは奇妙な問題が発生しています。

作成したコンテンツコントロールのIDプロパティにアクセスすると、数値IDの文字列が返されます。問題は、この値が大きすぎる場合、ドキュメントを保存した後、ドキュメントのdocument.xmlを調べた場合です。生成されたドキュメントでは、<w:id/>要素の要素に負の値があります。これは、生成されたコントロールのプロパティ<w:sdtPr/>から取得した値と符号付きで同等です。Id

例えば:

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

ドキュメントを保存してパッケージエクスプローラーで開くとId、コンテンツコントロールのは「3440157266」ではなく「-854810030」になります。

私が理解したのはこれです:

((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ファイル形式で保存すると、署名された値として保存されます。ソリューションがプログラムで返された値をファイル形式で保存された値にマップしようとする場合は、このプロパティから取得した値の符号なしバージョンと符号付きバージョンの両方をチェックする必要があります。

クロード・マーテルが述べたように、-854810030と3440157266は同一です。Int32符号付きを符号なしにキャストすることで、これを簡単に確認できます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 に答える