Telerik UI WPF - 如何以编程方式将 DocumentVariableField 添加到表格单元格

问题描述 投票:0回答:1

我们正在使用 Telerik UI for WPF 并创建一个表,然后将其插入到 RadRichTextBox 中。我们需要将 DocumentVariableField 添加到其中一个单元格,任何人都可以提供建议。

        public void AddAddress()
        {
            string addrName = " ";
            string[] rowName = new string[] { "Job Title", "Employer", "Address", "Tel.", "Tel. Dir.", "Mobile", "Email", "Website", "Fax", "Details", "Address", "Tel.", "Mobile", "Email", "Details" };
            if(_selelement != null)
            {
                addrName = _selelement.GetAttribute("title");
            }
            RadDocument document = new RadDocument();
            Section section = new Section();

            TableWidthUnit w1 = new TableWidthUnit(100);
            TableWidthUnit w2 = new TableWidthUnit(520);

            Table table = new Table();
            table.StyleName = RadDocumentDefaultStyles.DefaultTableGridStyleName;

            TableRow row1 = new TableRow();
            TableCell cell1 = new TableCell();
            cell1.Background = Color.FromRgb(174, 255, 190);
            cell1.PreferredWidth = w1;
            cell1.Padding = new Telerik.Windows.Documents.Layout.Padding(3, 6, 3, 6);
            Paragraph p1 = new Paragraph();
            Span s1 = new Span();
            s1.FontWeight = FontWeights.Bold;
            s1.FontFamily = new FontFamily(CGlobals.docu_default_font);
            s1.FontSize = Unit.PointToDip(CGlobals.docu_default_font_size);
            s1.Text = "Name";
            p1.Inlines.Add(s1);
            cell1.Blocks.Add(p1);
            row1.Cells.Add(cell1);

            TableCell cell2 = new TableCell();
            cell2.Background = Color.FromRgb(174, 255, 190);
            cell2.PreferredWidth = w2;
            cell2.Padding = new Telerik.Windows.Documents.Layout.Padding(3, 6, 3, 6);
            Paragraph p2 = new Paragraph();
            Span s2 = new Span();
            s2.FontWeight = FontWeights.Bold;
            s2.FontFamily = new FontFamily(CGlobals.docu_default_font);
            s2.FontSize = Unit.PointToDip(CGlobals.docu_default_font_size);
            s2.Text = addrName;  // This needs to contain the DocumentVariable
            p2.Inlines.Add(s2);
            cell2.Blocks.Add(p2);
            row1.Cells.Add(cell2);
            table.Rows.Add(row1);

            int rowCount = 0;
            foreach(string rname in rowName)
            {
                rowCount++;
                row1 = new TableRow();
                cell1 = new TableCell();
                p1 = new Paragraph();
                if (rowCount < 11)
                {
                    cell1.Background = Color.FromRgb(255, 229, 153);
                    p1.Background = Color.FromRgb(255, 229, 153);
                }
                else
                {
                    cell1.Background = Color.FromRgb(196, 255, 255);
                    p1.Background = Color.FromRgb(196, 255, 255);
                }
                cell1.Padding = new Telerik.Windows.Documents.Layout.Padding(3, 6, 3, 6);
                s1 = new Span();
                s1.FontWeight = FontWeights.Bold;
                s1.FontFamily = new FontFamily(CGlobals.docu_default_font);
                s1.FontSize = Unit.PointToDip(CGlobals.docu_default_font_size);
                s1.Text = rname;
                p1.Inlines.Add(s1);
                cell1.Blocks.Add(p1);
                row1.Cells.Add(cell1);

                cell2 = new TableCell();
                cell2.Background = Color.FromRgb(255, 255, 255);
                cell2.Padding = new Telerik.Windows.Documents.Layout.Padding(3, 6, 3, 6);
                p2 = new Paragraph();
                s2 = new Span();
                s2.FontFamily = new FontFamily(CGlobals.docu_default_font);
                s2.FontSize = Unit.PointToDip(CGlobals.docu_default_font_size);
                s2.Text = " ";
                p2.Inlines.Add(s2);
                cell2.Blocks.Add(p2);
                row1.Cells.Add(cell2);
                table.Rows.Add(row1);
            }

            section.Blocks.Add(new Paragraph());
            section.Blocks.Add(table);
            section.Blocks.Add(new Paragraph());
            document.Sections.Add(section);

            doc_text.Document = document;

            // Add a DocumentVariable and assign the value to it
            // This needs to be changed so the variable can be added to Row 1, Cell 2 in the table created above
            doc_text.Document.DocumentVariables.Add("1001", addrName);
            DocumentVariableField docVariable = new DocumentVariableField() { VariableName = "1001"  };
           
            doc_text.InsertField(docVariable, FieldDisplayMode.Result);

//            ChangeAddress(addrName);
        }

需要使用变量,以便在修改 UI 中的另一个字段时可以更新该变量。 enter image description here

在上面的代码中,DocumentVariableField被添加到文档中,我们可以通过以下方式更新:

public void ChangeAddress(string address)
{
    doc_text.Document.DocumentVariables["1001"] = address;
    var field = doc_text.Document.EnumerateChildrenOfType<FieldRangeStart>().Where(x => x.Field.FieldTypeName == "DOCVARIABLE"
    && ((DocumentVariableField)x.Field).VariableName == "1001").FirstOrDefault();

    if (field != null)
    {
        doc_text.UpdateField(field);
    }
}

我尝试过使用标签,但当 RadRichTextBox 的内容保存到 RTF 时,它们不会持续存在。

谢谢你

c# wpf telerik
1个回答
0
投票

Telerik 的好心人给我带来了解决方案。

他们建议使用 RadDocumentEditor:

    // Code Supplied by Telerik
    RadDocumentEditor editor = new RadDocumentEditor(document);
    var cell = document.EnumerateChildrenOfType<TableCell>().ToList()[1];

    if (cell != null)
    {
        DocumentPosition position = new DocumentPosition(document);
        position.MoveToDocumentElementStart(cell.Blocks.First());
        document.CaretPosition.MoveToPosition(position);
        DocumentVariableField docVariable = new DocumentVariableField() { VariableName = "1001" };
        editor.InsertField(docVariable);
    }
    doc_text.Document = document;

    // Add a DocumentVariable and assign the value to it
    // This needs to be changed so the variable can be added to Row 1, Cell 2 in the table created above
    //doc_text.Document.DocumentVariables.Add("1001", addrName);

    ChangeAddress(addrName);
© www.soinside.com 2019 - 2024. All rights reserved.