将可调整大小的表格添加到 Richtextbox(.net 或 C#)
Adding resizable tables to a Richtextbox (.net or C#)
我们的 Capstone 小组正在设计一个用于设计教学大纲模板的精简文本编辑器,其中一个要求是能够添加和删除可调整大小的 tables,其功能类似于 Microsoft Word (rtf) tables,它们必须可以通过 "dragging" 调整大小以及自定义字体等。
它们还必须放置在 RichTextBox 中,或者至少以可以在常规文本和包含文本的单元格之间轻松转换的方式放置。
我们尝试过使用不同的方法,包括 tablelayoutpanel(不起作用,因为它不能直接放在 richtextbox 中),我们发现最接近的方法是使用 Stringbuilder,但这仍然不能完全工作,因为单元格不能调整大小,并且字符串本身很难操作。我们还需要 "merge cells".
的能力
我们尝试过在 .net 和 C# 中进行设计,但结果相似。如果有人对如何运行此程序有任何建议,我将不胜感激。这是 table 创建的代码:
Private Sub tsbTwoRows_Click(sender As Object, e As EventArgs) Handles tsbTwoRows.Click
Dim rtbTemp As New RichTextBox
Dim sbTaRtf As New System.Text.StringBuilder
'These strings are necessary so that it will be visible in MS Word
sbTaRtf.Append("{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fnil\fcharset0 Microsoft Sans Serif;}}")
sbTaRtf.Append("\viewkind4\uc1\trowd\trgaph108\trleft5\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 ")
sbTaRtf.Append("\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs")
sbTaRtf.Append("\cellx4678") 'set the width of the first cell
sbTaRtf.Append("\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs")
sbTaRtf.Append("\cellx9355") 'set the width of the second cell
sbTaRtf.Append("\pard\intbl\ltrpar\sl252\slmult1\lang3082\f0\fs22\cell\cell\cell\row")
sbTaRtf.Append("\pard\ltrpar\lang1033\f1\fs17\par")
sbTaRtf.Append("}")
rtbTemp.Rtf = sbTaRtf.ToString()
'This prevents the new table from deleting the text
rtbContent.SelectedRtf = rtbTemp.Rtf
rtbTemp.Undo()
Me.rtbContent.Focus()
Me.rtbContent.SelectionStart = Me.rtbContent.SelectionStart - 1
Me.rtbContent.SelectionLength = 0
End Sub
好的,经过大量的试验和错误,我们发现 stringbuilder 在 .net 上的工作相当不稳定,我们在 c# 上尝试了以下代码,它工作得更好:
StringBuilder tableRtf = new StringBuilder();
tableRtf.Append(@"{\rtf1");
tableRtf.Append(@"\trowd");
tableRtf.Append(@"\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs");
tableRtf.Append(@"\cellx1000");
tableRtf.Append(@"\trrh3000");
tableRtf.Append(@"\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs");
tableRtf.Append(@"\cellx3000");
tableRtf.Append(@"\intbl \cell \row");
tableRtf.Append(@"\pard");
tableRtf.Append(@"}");
string combined2 = tableRtf.ToString();
string combined1 = this.TextEditor.Rtf.ToString();
tableRtf.AppendLine(tableRtf.ToString());
TextEditor.Select(TextEditor.TextLength, 0);
TextEditor.SelectedRtf = tableRtf.ToString();
这将创建一个单元格形式的字符串,围绕您在其中输入的文本,您可以轻松更改其中的字体,使用 \trrh 对单元格的高度进行编程,并且可以在 windows 表单程序以及导出时在 Word 中。最初,它在导出到 Word 时不可见,所以我添加了 tableRtf.Append(@"\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs");行,并为其指定了 Word 可识别的字体。最重要的是,当在 table 中键入内容并按回车键创建新行时,单元格会自动调整自身大小以适应内容。
我们的 Capstone 小组正在设计一个用于设计教学大纲模板的精简文本编辑器,其中一个要求是能够添加和删除可调整大小的 tables,其功能类似于 Microsoft Word (rtf) tables,它们必须可以通过 "dragging" 调整大小以及自定义字体等。 它们还必须放置在 RichTextBox 中,或者至少以可以在常规文本和包含文本的单元格之间轻松转换的方式放置。
我们尝试过使用不同的方法,包括 tablelayoutpanel(不起作用,因为它不能直接放在 richtextbox 中),我们发现最接近的方法是使用 Stringbuilder,但这仍然不能完全工作,因为单元格不能调整大小,并且字符串本身很难操作。我们还需要 "merge cells".
的能力我们尝试过在 .net 和 C# 中进行设计,但结果相似。如果有人对如何运行此程序有任何建议,我将不胜感激。这是 table 创建的代码:
Private Sub tsbTwoRows_Click(sender As Object, e As EventArgs) Handles tsbTwoRows.Click
Dim rtbTemp As New RichTextBox
Dim sbTaRtf As New System.Text.StringBuilder
'These strings are necessary so that it will be visible in MS Word
sbTaRtf.Append("{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fnil\fcharset0 Microsoft Sans Serif;}}")
sbTaRtf.Append("\viewkind4\uc1\trowd\trgaph108\trleft5\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 ")
sbTaRtf.Append("\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs")
sbTaRtf.Append("\cellx4678") 'set the width of the first cell
sbTaRtf.Append("\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs")
sbTaRtf.Append("\cellx9355") 'set the width of the second cell
sbTaRtf.Append("\pard\intbl\ltrpar\sl252\slmult1\lang3082\f0\fs22\cell\cell\cell\row")
sbTaRtf.Append("\pard\ltrpar\lang1033\f1\fs17\par")
sbTaRtf.Append("}")
rtbTemp.Rtf = sbTaRtf.ToString()
'This prevents the new table from deleting the text
rtbContent.SelectedRtf = rtbTemp.Rtf
rtbTemp.Undo()
Me.rtbContent.Focus()
Me.rtbContent.SelectionStart = Me.rtbContent.SelectionStart - 1
Me.rtbContent.SelectionLength = 0
End Sub
好的,经过大量的试验和错误,我们发现 stringbuilder 在 .net 上的工作相当不稳定,我们在 c# 上尝试了以下代码,它工作得更好:
StringBuilder tableRtf = new StringBuilder();
tableRtf.Append(@"{\rtf1");
tableRtf.Append(@"\trowd");
tableRtf.Append(@"\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs");
tableRtf.Append(@"\cellx1000");
tableRtf.Append(@"\trrh3000");
tableRtf.Append(@"\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs");
tableRtf.Append(@"\cellx3000");
tableRtf.Append(@"\intbl \cell \row");
tableRtf.Append(@"\pard");
tableRtf.Append(@"}");
string combined2 = tableRtf.ToString();
string combined1 = this.TextEditor.Rtf.ToString();
tableRtf.AppendLine(tableRtf.ToString());
TextEditor.Select(TextEditor.TextLength, 0);
TextEditor.SelectedRtf = tableRtf.ToString();
这将创建一个单元格形式的字符串,围绕您在其中输入的文本,您可以轻松更改其中的字体,使用 \trrh 对单元格的高度进行编程,并且可以在 windows 表单程序以及导出时在 Word 中。最初,它在导出到 Word 时不可见,所以我添加了 tableRtf.Append(@"\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs");行,并为其指定了 Word 可识别的字体。最重要的是,当在 table 中键入内容并按回车键创建新行时,单元格会自动调整自身大小以适应内容。