【问题标题】:dynamic content control mapping for MS word c#MS word c#的动态内容控制映射
【发布时间】:2015-06-09 18:01:22
【问题描述】:

我正在使用这样的代码:

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的标签

【问题讨论】:

    标签: c# dynamic contentcontrol word-addins


    【解决方案1】:

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

    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])
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2020-09-21
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多