2015-08-19 2 views
2

У меня есть документ, который я редактирую с помощью приложения WPF (C#). Я успешно отредактировал элементы управления содержанием Plain Text, но теперь я застреваю проверку/снятие флажков в форме.Установка значения в OpenXml флажок word2013

Я успешно установил флажок и установил значение и сохранил документ, но флажки, установленные в true, никогда не проверяются в документе слова при его открытии.

Вот код, который я использую для манипулирования флажками. Примечание: получить доступ к флажков на уровне тегов, поэтому field.parent.parent

private static void SetCheckBox(OpenXmlElement field, bool isChecked) 
{ 
    var checkBox = field.Parent.Parent.Descendants<SdtContentCheckBox>().ToList(); 
    foreach (var check in checkBox) 
    { 
     if (isChecked) 
     { 
      check.Checked.Val = OnOffValues.True; 
     } 
     else 
     { 
      check.Checked.Val = OnOffValues.False; 
     } 
     MessageBox.Show(check.Checked.Val); 
    } 
} 

Когда я отображения значений в MessageBox они показывают 0/1 для истина/ложь. Таким образом, они фактически устанавливаются.

Я делаю это правильно?

ответ

2

Таким образом, должно быть установлено не только значение Checked для флажка, но так должно быть изменено значение Text.

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

КОД:

private static void SetCheckBox(OpenXmlElement field, bool isChecked) 
{ 
    if (isChecked) 
    { 
     field.Parent.Parent.FirstChild.GetFirstChild<SdtContentCheckBox>().Checked.Val = OnOffValues.True; 
     field.Parent.Parent.Descendants<Run>().First().GetFirstChild<Text>().Text = "☒"; 
    } 
    else 
    { 
     field.Parent.Parent.FirstChild.GetFirstChild<SdtContentCheckBox>().Checked.Val = OnOffValues.False; 
     field.Parent.Parent.Descendants<Run>().First().GetFirstChild<Text>().Text = "☐"; 
    } 
} 

СЖАТОЙ:

private static void SetCheckBox(OpenXmlElement field, bool isChecked) 
{ 
    field.Parent.Parent.FirstChild.GetFirstChild<SdtContentCheckBox>().Checked.Val = isChecked ? OnOffValues.True : OnOffValues.False; 
    field.Parent.Parent.Descendants<Run>().First().GetFirstChild<Text>().Text = isChecked ? "☒" : "☐"; 
} 
+0

Является ли это решение вашей проблемы? –

+0

@ MaximePorté да это – cmircovich

+0

Ты прибил его, спасибо! – Themos

1

Другой вариант кода для решения этой проблемы:

private void ResetFile(string filePath) 
    { 
     using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true)) 
     { 
      try 
      { 
       string uncheckValue = "☐"; 
       string checkValue = "☒"; 

       foreach (SdtContentCheckBox ctrl in doc.MainDocumentPart.Document.Body.Descendants<SdtContentCheckBox>()) 
       { 
        if (ctrl.Checked.Val == OnOffValues.One) 
        { 
         ctrl.Checked.Val = OnOffValues.Zero; 
         if (ctrl.Parent.Parent.Descendants<SdtContentRun>().ToList().Count > 0) 
         { 
          SdtContentRun text = (SdtContentRun)ctrl.Parent.Parent.Descendants<SdtContentRun>().ToList()[0]; 
          text.InnerXml = text.InnerXml.Replace(checkValue, uncheckValue); 
         } 
        } 
       } 

       doc.MainDocumentPart.Document.Save(); 
      } 
      catch { } 
     } 
    } 
Смежные вопросы