在OpenXml复选框word2013中设置值

时间:2015-08-19 16:39:53

标签: c# wpf checkbox openxml

所以我有一个我正在通过WPF(C#)应用程序编辑的文档。 我已成功编辑了纯文本内容控件,但现在我无法检查/取消选中表单中的复选框。

我成功找到了复选框并设置了值并保存了文档,但是当我打开它时,从未在word文档中检查设置为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表示true / false。所以他们实际上已经确定了。

我这样做了吗?

2 个答案:

答案 0 :(得分:3)

因此,似乎不仅必须设置复选框的Checked值,而且必须更改Text值。

所以我最近的代码也有一些改动,但它改变了复选框的麻烦。

<强> CODE:

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 ? "☒" : "☐";
}

答案 1 :(得分: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 { }
        }
    }