使用 Open XML SDK 通过标签 属性 查找 Word 复选框控件
Find a Word check box control by its Tag property using Open XML SDK
我有一个包含复选框控件的 Word 2013 文档。我已将此复选框的 Tag 属性 设置为 fooCheckBox
:
现在我想使用 Open XML SDK 2.5 以编程方式查找和操作该特定复选框。我知道如何 find/enumerate 复选框,但我不知道如何通过 Tag 属性:[=18= 找到特定的 SdtContentCheckBox
]
给定一个 WordprocessingDocument doc
,我如何通过其 标签 属性 检索特定的 SdtContentCheckBox
?
(我有工作代码,我将其作为 发布。但是,我不知道这是否是正确的方法;所以如果有人知道更好、更合适的方法,我想看看它是怎么做到的。)
显然,一个 SdtContentCheckBox
对象的 .Parent
属性 引用了一个 SdtProperty
集合,可以查询一个 Tag
后代。
我不明白这个对象建模背后的逻辑,但它可以用来完成工作:
// using DocumentFormat.OpenXml.Packaging;
// using System.Diagnostics;
// using System.Linq;
SdtContentCheckBox TryGetCheckBoxByTag(WordprocessingDocument doc, string tag)
{
foreach (var checkBox in doc.MainDocumentPart.Document.Descendants<SdtContentCheckBox>())
{
var tagProperty = checkBox.Parent.Descendants<Tag>().FirstOrDefault();
if (tagProperty != null)
{
Debug.Assert(tagProperty.Val != null);
if (tagProperty.Val.Value == tag)
{
// a checkbox with the given tag property was found
return checkBox;
}
}
}
// no checkbox with the given tag property was found
return null;
}
我有一个包含复选框控件的 Word 2013 文档。我已将此复选框的 Tag 属性 设置为 fooCheckBox
:
现在我想使用 Open XML SDK 2.5 以编程方式查找和操作该特定复选框。我知道如何 find/enumerate 复选框,但我不知道如何通过 Tag 属性:[=18= 找到特定的 SdtContentCheckBox
]
给定一个 WordprocessingDocument doc
,我如何通过其 标签 属性 检索特定的 SdtContentCheckBox
?
(我有工作代码,我将其作为
显然,一个 SdtContentCheckBox
对象的 .Parent
属性 引用了一个 SdtProperty
集合,可以查询一个 Tag
后代。
我不明白这个对象建模背后的逻辑,但它可以用来完成工作:
// using DocumentFormat.OpenXml.Packaging;
// using System.Diagnostics;
// using System.Linq;
SdtContentCheckBox TryGetCheckBoxByTag(WordprocessingDocument doc, string tag)
{
foreach (var checkBox in doc.MainDocumentPart.Document.Descendants<SdtContentCheckBox>())
{
var tagProperty = checkBox.Parent.Descendants<Tag>().FirstOrDefault();
if (tagProperty != null)
{
Debug.Assert(tagProperty.Val != null);
if (tagProperty.Val.Value == tag)
{
// a checkbox with the given tag property was found
return checkBox;
}
}
}
// no checkbox with the given tag property was found
return null;
}