动态内容控制映射的mswordc#

本文关键字:mswordc# 映射 内容控制 动态 | 更新日期: 2023-09-27 17:55:02

我使用的代码是这样的:

public void BindControlsToCustomXmlPart()
    {
          wordApp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
          foreach (Word.ContentControl contentControl in wordApp.ActiveDocument.ContentControls)
          {
              if (contentControl.Tag == "FieldName")
              {
                  string xPathFieldName = "ns:records/ns:record/ns:FieldName";
                  contentControl.XMLMapping.SetMapping(xPathFieldName,
                    prefix, currentWordDocumentXMLPart);
              }

最后发生的是,我想添加的每一个新字段,我都必须重复这个冗余代码:

              if (contentControl.Tag == "FieldName2")
              {
                  string xPathFieldName2 = "ns:records/ns:record/ns:FieldName2";
                  contentControl.XMLMapping.SetMapping(xPathFieldName2,
                    prefix, currentWordDocumentXMLPart);
              }

是否有一种方法,我可以写这段代码一次,并有"FieldName"部分得到动态更新的每个字段?也就是说,有一些类型的循环,将增量通过每个xml文件中的xmlnode(在这种情况下,它将映射xml节点FieldName与FieldName标签的内容控件,然后映射xml节点FieldName2与FieldName2标签的内容控件

动态内容控制映射的mswordc#

一个好的开始是创建一个函数来转换控件并多次重用该函数,如下所示

public contentControl BindControlsOperation(contentControl control, string pFieldName)
{
          if (control.Tag == pFieldName)
          {
             string xPathFieldName = String.Format("ns:records/ns:record/ns:{0}",pFieldName);
             control.XMLMapping.SetMapping(xPathFieldName,prefix, currentWordDocumentXMLPart);
          }
          return control;
 }

然后您可以按照以下方式使用它

  foreach (Word.ContentControl contentControl in wordApp.ActiveDocument.ContentControls)
  {
          contentControl = BindControlsOperation(contentControl,"FieldName")
  }

下一步是有一个你想要用于字段的名称列表,并使用for循环

将其提供给你的算法
.... 
List<string> names = "x,y,z";
for(int i=0;i < names.length();i++)
{
 wordApp.ActiveDocument.ContentControls[i] = BindControlsOperation(wordApp.ActiveDocument.ContentControls[i],name[i])
}

希望能有所帮助