选择文本并在 RichTextBox 的一行上更改它的颜色
Selecting text and changing it's color on a line of a RichTextBox
下午好。作为 poster,我是堆栈溢出的新手,但多年来一直在引用它。我已经研究了我的这个问题大约 2 周,虽然我已经看到了接近的解决方案,但我仍然有一个问题。
我正在编写一个 C# gui,它读取汇编代码文件并突出显示不同的文本项,以便通过另一个程序进行进一步处理。我的表单有一个显示文本的 RichTextBox。在下面的例子中,我试图 select ‘;’ 位置的文本直到行尾,并将文本更改为红色。这是我正在使用的代码。
请注意:程序读取的文件长度不一致,并非所有行的格式都相同,所以我不能简单地搜索';'并对其进行操作。
在另一个 post 上,一位成员为 AppendText 提供了一个扩展方法,我已经完美地工作了,除了原始文本仍然存在以及我重新格式化的文本。这是该站点的 link:
How to use multi color in richtextbox
// Loop that it all runs in
Foreach (var line in inArray)
{
// getting the index of the ‘;’ assembly comments
int cmntIndex = line.LastIndexOf(';');
// getting the index of where I am in the rtb at this time.
int rtbIndex = rtb.GetFirstCharIndexOfCurrentLine();
// just making sure I have a valid index
if (cmntIndex != -1)
{
// using rtb.select to only select the desired
// text but for some reason I get it all
rtb.Select(cmntIndex + rtbIndex, rtb.SelectionLength);
rtb.SelectionColor = Color.Red;
}
}
下面是原始格式文件中的示例汇编代码,所有文本都是黑色的:
;;TAG SOMETHING, SOMEONE START
ASSEMBLY CODE ; Assembly comments
ASSEMBLY CODE ; Assembly comments
ASSEMBLY CODE ; Assembly comments
;;TAG SOMETHING, SOMEONE FINISH
当调用 rtb.GetFirstCharIndexOfCurrentLine()
时,它 returns 是 RTB 的有效索引,我想如果我添加 line.LastIndexOf(';')
返回的值,我就可以 select 上面看起来像 ; Assembly comments
的文本并将其变为红色。
实际情况是整条线都变成了红色。
当我使用上面的 AppendText 方法时,我得到
ASSEMBLY CODE (this is black) ; Assembly comments (this is red) (the rest is black) ASSEMBLY CODE ; Assembly comments
黑色代码与重新着色的文本完全相同。在这种情况下,我需要知道如何清除 RTB and/or 中的行并覆盖那里的文本。我尝试过的所有选项都会删除这些行。
任何人,我敢肯定这很长,但我在这里真的很困惑,非常感谢您的建议。
希望我没听错。
这会遍历 richtextbox
中的每一行,计算出哪些行是程序集注释,然后将“;”之后的所有内容都设为红色
按要求使用 FOREACH 循环
要使用 foreach 循环,您只需像这样手动跟踪索引:
// Index
int index = 0;
// Loop over each line
foreach (string line in richTextBox1.Lines)
{
// Ignore the non-assembly lines
if (line.Substring(0, 2) != ";;")
{
// Start position
int start = (richTextBox1.GetFirstCharIndexFromLine(index) + line.LastIndexOf(";") + 1);
// Length
int length = line.Substring(line.LastIndexOf(";"), (line.Length - (line.LastIndexOf(";")))).Length;
// Make the selection
richTextBox1.SelectionStart = start;
richTextBox1.SelectionLength = length;
// Change the colour
richTextBox1.SelectionColor = Color.Red;
}
// Increase index
index++;
}
有FOR循环
// Loop over each line
for(int i = 0; i < richTextBox1.Lines.Count(); i++)
{
// Current line text
string currentLine = richTextBox1.Lines[i];
// Ignore the non-assembly lines
if (currentLine.Substring(0, 2) != ";;")
{
// Start position
int start = (richTextBox1.GetFirstCharIndexFromLine(i) + currentLine.LastIndexOf(";") + 1);
// Length
int length = currentLine.Substring(currentLine.LastIndexOf(";"), (currentLine.Length - (currentLine.LastIndexOf(";")))).Length;
// Make the selection
richTextBox1.SelectionStart = start;
richTextBox1.SelectionLength = length;
// Change the colour
richTextBox1.SelectionColor = Color.Red;
}
}
编辑:
重新阅读你的问题我很困惑你是否想要制作;还有红色。
如果您确实从此行中删除了 +1:
int start = (richTextBox1.GetFirstCharIndexFromLine(i) + currentLine.LastIndexOf(";") + 1);
Private Sub RichTextBox1_Click(sender As Object, e As EventArgs) Handles RichTextBox1.Click
Dim MyInt1 As Integer
Dim MyInt2 As Integer
' Reset your RTB back color to white at each click
RichTextBox1.SelectionBackColor = Color.White
' Define the nth first character number of the line you clicked
MyInt1 = RichTextBox1.GetFirstCharIndexOfCurrentLine()
' use that nth to find the line number in the RTB
MyInt2 = RichTextBox1.GetLineFromCharIndex(MyInt1)
'Select the line using an array property of RTB (RichTextBox1.Lines())
RichTextBox1.Select(MyInt1, RichTextBox1.Lines(MyInt2).Length)
' This line would be for font color change : RichTextBox1.SelectionColor = Color.Maroon
' This one changes back color :
RichTextBox1.SelectionBackColor = Color.Yellow
End Sub
' rtb.select 方法存在一些固有的错误
' 如果换行或在“http”行上失败,它会出错……可能更多。
(我刚刚注意到上面代码中的默认 whosebug.com 字符颜色对于注释行和其他行不正确。)
下午好。作为 poster,我是堆栈溢出的新手,但多年来一直在引用它。我已经研究了我的这个问题大约 2 周,虽然我已经看到了接近的解决方案,但我仍然有一个问题。
我正在编写一个 C# gui,它读取汇编代码文件并突出显示不同的文本项,以便通过另一个程序进行进一步处理。我的表单有一个显示文本的 RichTextBox。在下面的例子中,我试图 select ‘;’ 位置的文本直到行尾,并将文本更改为红色。这是我正在使用的代码。
请注意:程序读取的文件长度不一致,并非所有行的格式都相同,所以我不能简单地搜索';'并对其进行操作。
在另一个 post 上,一位成员为 AppendText 提供了一个扩展方法,我已经完美地工作了,除了原始文本仍然存在以及我重新格式化的文本。这是该站点的 link: How to use multi color in richtextbox
// Loop that it all runs in
Foreach (var line in inArray)
{
// getting the index of the ‘;’ assembly comments
int cmntIndex = line.LastIndexOf(';');
// getting the index of where I am in the rtb at this time.
int rtbIndex = rtb.GetFirstCharIndexOfCurrentLine();
// just making sure I have a valid index
if (cmntIndex != -1)
{
// using rtb.select to only select the desired
// text but for some reason I get it all
rtb.Select(cmntIndex + rtbIndex, rtb.SelectionLength);
rtb.SelectionColor = Color.Red;
}
}
下面是原始格式文件中的示例汇编代码,所有文本都是黑色的:
;;TAG SOMETHING, SOMEONE START
ASSEMBLY CODE ; Assembly comments
ASSEMBLY CODE ; Assembly comments
ASSEMBLY CODE ; Assembly comments
;;TAG SOMETHING, SOMEONE FINISH
当调用 rtb.GetFirstCharIndexOfCurrentLine()
时,它 returns 是 RTB 的有效索引,我想如果我添加 line.LastIndexOf(';')
返回的值,我就可以 select 上面看起来像 ; Assembly comments
的文本并将其变为红色。
实际情况是整条线都变成了红色。
当我使用上面的 AppendText 方法时,我得到
ASSEMBLY CODE (this is black) ; Assembly comments (this is red) (the rest is black) ASSEMBLY CODE ; Assembly comments
黑色代码与重新着色的文本完全相同。在这种情况下,我需要知道如何清除 RTB and/or 中的行并覆盖那里的文本。我尝试过的所有选项都会删除这些行。
任何人,我敢肯定这很长,但我在这里真的很困惑,非常感谢您的建议。
希望我没听错。
这会遍历 richtextbox
中的每一行,计算出哪些行是程序集注释,然后将“;”之后的所有内容都设为红色
按要求使用 FOREACH 循环
要使用 foreach 循环,您只需像这样手动跟踪索引:
// Index
int index = 0;
// Loop over each line
foreach (string line in richTextBox1.Lines)
{
// Ignore the non-assembly lines
if (line.Substring(0, 2) != ";;")
{
// Start position
int start = (richTextBox1.GetFirstCharIndexFromLine(index) + line.LastIndexOf(";") + 1);
// Length
int length = line.Substring(line.LastIndexOf(";"), (line.Length - (line.LastIndexOf(";")))).Length;
// Make the selection
richTextBox1.SelectionStart = start;
richTextBox1.SelectionLength = length;
// Change the colour
richTextBox1.SelectionColor = Color.Red;
}
// Increase index
index++;
}
有FOR循环
// Loop over each line
for(int i = 0; i < richTextBox1.Lines.Count(); i++)
{
// Current line text
string currentLine = richTextBox1.Lines[i];
// Ignore the non-assembly lines
if (currentLine.Substring(0, 2) != ";;")
{
// Start position
int start = (richTextBox1.GetFirstCharIndexFromLine(i) + currentLine.LastIndexOf(";") + 1);
// Length
int length = currentLine.Substring(currentLine.LastIndexOf(";"), (currentLine.Length - (currentLine.LastIndexOf(";")))).Length;
// Make the selection
richTextBox1.SelectionStart = start;
richTextBox1.SelectionLength = length;
// Change the colour
richTextBox1.SelectionColor = Color.Red;
}
}
编辑:
重新阅读你的问题我很困惑你是否想要制作;还有红色。
如果您确实从此行中删除了 +1:
int start = (richTextBox1.GetFirstCharIndexFromLine(i) + currentLine.LastIndexOf(";") + 1);
Private Sub RichTextBox1_Click(sender As Object, e As EventArgs) Handles RichTextBox1.Click
Dim MyInt1 As Integer
Dim MyInt2 As Integer
' Reset your RTB back color to white at each click
RichTextBox1.SelectionBackColor = Color.White
' Define the nth first character number of the line you clicked
MyInt1 = RichTextBox1.GetFirstCharIndexOfCurrentLine()
' use that nth to find the line number in the RTB
MyInt2 = RichTextBox1.GetLineFromCharIndex(MyInt1)
'Select the line using an array property of RTB (RichTextBox1.Lines())
RichTextBox1.Select(MyInt1, RichTextBox1.Lines(MyInt2).Length)
' This line would be for font color change : RichTextBox1.SelectionColor = Color.Maroon
' This one changes back color :
RichTextBox1.SelectionBackColor = Color.Yellow
End Sub
' rtb.select 方法存在一些固有的错误 ' 如果换行或在“http”行上失败,它会出错……可能更多。 (我刚刚注意到上面代码中的默认 whosebug.com 字符颜色对于注释行和其他行不正确。)