Question

Comment peut-on obtenir une poignée à un contrôle CheckBox qui est incorporé dans un document Word en utilisant OpenXML?

On pourrait penser que ce soit Paragraph.ControlPropertiesPart ou Paragraph.Descendents () pourrait réaliser quelque chose, mais dans tous les cas unique j'obtenir un type null retourné.

Je peux traverser dans l'arbre de document en utilisant la structure XML réelle, mais cela semble compliqué.

Suggestions de bienvenue.

Était-ce utile?

La solution

Le code ci-dessous montre comment énumérer toutes les cases dans un document Word par selon la méthode de Decendants<CheckBox>() sur le corps du docuement.

using (WordprocessingDocument doc = WordprocessingDocument.Open("c:\\temp\\checkbox.docx", true))
{
  foreach (CheckBox cb in doc.MainDocumentPart.Document.Body.Descendants<CheckBox>())
  {
    Console.Out.WriteLine(cb.LocalName);

    FormFieldName cbName = cb.Parent.ChildElements.First<FormFieldName>();
    Console.Out.WriteLine(cbName.Val);

    DefaultCheckBoxFormFieldState defaultState = cb.GetFirstChild<DefaultCheckBoxFormFieldState>();
    Checked state = cb.GetFirstChild<Checked>();

    Console.Out.WriteLine(defaultState.Val.ToString());

    if (state.Val == null) // In case checkbox is checked the val attribute is null
    {
      Console.Out.WriteLine("CHECKED");
    }
    else
    {
      Console.Out.WriteLine(state.Val.ToString());
    }
  }
}

Pour déterminer le nom d'un élément d'entrée de case à cocher étant donné que vous devez accéder au propriété Parent de l'instance de CheckBox puis recherchez l'élément FormFieldName (pour attribuer un nom à une case à cocher Utiliser la boîte de dialogue Propriétés dans Microsoft Word).

La propriété DefaultCheckBoxFormFieldState de Val maintient l'état par défaut de la case à cocher. De plus, la propriété Val de l'élément Checked maintient l'état réel vérifié de l'instance de CheckBox. Remarque, pour Microsoft Word 2007 la propriété Val est null si la case est cochée.

BEGIN EDIT

Je voudrais étendre ma réponse. En fait, il existe deux types de contrôles de case à cocher sur l'onglet développeur MS Word - une case à cocher héritage et une case à cocher contrôle ActiveX. Le code ci-dessus peut être utilisé pour les cases existantes enumerte dans un document Word (voir cette article sur la façon de créer une case à cocher héritage).

Pour autant que je sache, vous ne pouvez pas utiliser le SDK OpenXML pour obtenir / valeurs de consigne pour une case à cocher ActiveX. Cependant, vous pouvez énumérer les contrôles ActiveX en utilisant le code suivant:

foreach (Control ctrl in doc.MainDocumentPart.Document.Body.Descendants<Control>())
{
   Console.Out.WriteLine(ctrl.Id);
   Console.Out.WriteLine(ctrl.Name);
   Console.Out.WriteLine(ctrl.ShapeId);
}

Pour déterminer si oui ou non une Control donnée est une case à cocher vous devez ckeck l'ID de classe du Control. L'ID de classe d'une case à cocher est {8BD21D40-EC42-11CE-9E0D-00AA006002F3}. Voici un exemple de code pour obtenir l'ID de classe (je ne sais pas s'il y a un moyen plus facile ...):

OpenXmlPart part = doc.MainDocumentPart.GetPartById(ctrl.Id);
OpenXmlReader re = OpenXmlReader.Create(part.GetStream());
re.Read();
OpenXmlElement el = re.LoadCurrentElement();          
if(el.GetAttribute("classid", el.NamespaceUri).Value == "{8BD21D40-EC42-11CE-9E0D-00AA006002F3}")
{
  Console.WriteLine("Checkbox found...");
}
re.Close();

FIN EDIT

EDIT 2

Je ne savais pas qu'il y ait un nouveau contrôle de case à cocher dans Word 2010 (Merci à Dennis Palmer).

Pour énumérer ces nouveaux contrôles de case à cocher, vous pouvez utiliser le code suivant:

using (WordprocessingDocument doc = WordprocessingDocument.Open(filename, true))
{
   MainDocumentPart mp = doc.MainDocumentPart;

   foreach(SdtContentCheckBox cb in mp.Document.Body.Descendants<SdtContentCheckBox>())
   {         
     if(cb.Checked.Val == "1");
     {
       Console.Out.WriteLine("CHECKED");  
     }           
   }
}

FIN EDIT 2

L'espoir, cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top