Sunday, 15 July 2012

c# - AltChunk corrupts rich text content control -



c# - AltChunk corrupts rich text content control -

i used altchunk object re-create info docx file rich text content command in file. re-create works fine. content command cannot cast sdtelement in openxml nor contentcontrol in vsto.

this code used

sdtelement sdtelement = destinationdocument.maindocumentpart.document.body.descendants<sdtelement>().where(b => b.sdtproperties.getfirstchild<tag>() != null).firstordefault(); string altchunkid = "altchunkid" + guid.newguid().tostring(); alternativeformatimportpart chunk = destinationdocument.maindocumentpart.addalternativeformatimportpart(alternativeformatimport parttype.wordprocessingml, altchunkid); chunk.feeddata(file.open("sourcefile", filemode.openorcreate)); altchunk altchunk = new altchunk(); altchunk.id = altchunkid; sdtelement.removeallchildren(); sdtelement.append(altchunk);

the first time code works fine. @ sec run first line throws unable cast exception. same problem occurs while using vsto @ client side contentcontrol object cannot hold content command in altchunk inserted. somehow procedure corrupts rich text content control.

is there doing wrong? or there improve alternative?

worddocument.maindocumentpart.document.body.descendants<sdtelement>() returns ienumerable<sdtelement> , assiging sdtelemtnt. seek using var or actual homecoming type.

update:

your code working one. doing wrong line sdtelement.removeallchildren();

an sdt element (content control) contains other elements sdtpr (content command properties), sdtcontent (the actual content within content control) etc. in below eg.

<w:sdt> <w:sdtpr> ... </w:sdtpr> <w:sdtcontent> .... </w:sdtcontent> </w:sdt>

what sdtelement.removeallchildren(); doing delete within sdt element , replacing them as:

<w:sdt> <w:altchunk r:id="altchunkidffebf242-30b3-4905-bf39-fc0077be9474" /> </w:sdt>

which making programme throw exception on secondrun in line destinationdocument.maindocumentpart.document.body.descendants<sdtelement>().where(b => b.sdtproperties.getfirstchild<tag>() != null).firstordefault(); replaced document sdt element has no sdtproperties , no tag or sdtcontent.

to workaround problem seek inserting altchunk block content command content element (sdtcontent) instead of sdt element straight below:

using ( filestream filestream = file.open("file.docx", filemode.open)) { chunk.feeddata(filestream); altchunk altchunk = new altchunk(); altchunk.id = altchunkid; //sdtelement.removeallchildren(); sdtelement.elements<sdtcontentblock>().firstordefault().append(altchunk); // going add together existing content. }

hope helps!

c# ms-word vsto openxml

No comments:

Post a Comment