Удалите форму управления контентом WordprocessingDocument, не теряя места - PullRequest
0 голосов
/ 27 июня 2018

Я удаляю Контент Контроля из документа Word с этим кодом (размещен на ссылка )

 MainDocumentPart mainPart = _wordDocument.MainDocumentPart;
 List<SdtBlock> sdtList = mainPart.Document.Descendants<SdtBlock>).ToList();

  foreach (SdtBlock sdt in sdtList)
  {
    OpenXmlElement sdtc = sdt.GetFirstChild<SdtContentBlock>();
    OpenXmlElement parent = sdt.Parent;
    OpenXmlElementList elements = sdtc.ChildElements;  

    var mySdtc = new SdtContentBlock(sdtc.OuterXml);         
    foreach (OpenXmlElement elem in elements)
    {
       parent.Append((OpenXmlElement)elem.Clone());                   
    }       
    sdt.Remove();
  }

Все работает нормально, но текст после операции удаления теряет место, в котором он находился до операции. Я знаю SimplifyMarkup из openxmlpowertools, но не могу его использовать. Спасибо за любые предложения

1 Ответ

0 голосов
/ 27 июня 2018

Вы вытаскиваете коврик из-под ног.

foreach (SdtBlock sdt in sdtList)
{
    sdt.Remove();
    // Now what?
}

В точке комментария (хотя на самом деле она находится в скобках), sdt не существует, так как перейти к следующему, когда вы не знаете, где находитесь?

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

foreach (int i = sdtList.Count() -1; i > 0; i--)
{
    var sdt = sdtList[i];
    OpenXmlElement sdtc = sdt.GetFirstChild<SdtContentBlock>();
    OpenXmlElement parent = sdt.Parent;
    OpenXmlElementList elements = sdtc.ChildElements;  

    var mySdtc = new SdtContentBlock(sdtc.OuterXml);         
    foreach (OpenXmlElement elem in elements)
    {
        parent.Append((OpenXmlElement)elem.Clone());                   
    }       
    sdtList.Remove(sdtList[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...