我正在编写一个C#gui,它读入汇编代码文件并突出显示不同的文本项,以便通过另一个程序进一步处理。我的表单有一个显示文本的RichTextBox。在下面的例子中,我试图选择';'位置的文本,直到行的结尾,并将文本更改为红色。这是我正在使用的代码。
请注意:程序读入的文件长度不一致,并非所有行的格式都相同,因此我不能简单地搜索&#39 ;;'并对此进行操作。
在另一篇文章中,一个成员为AppendText提供了一个扩展方法,除了原始文本和我重新格式化的文本一起存在之外,我已经完美地工作了。这是该网站的链接: 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()
时,它返回RTB的有效索引,我想如果我添加line.LastIndexOf(';')
返回的值,那么我将只能选择上面的文本{ {1}}并将其变为红色。
发生的是整条线变红。
当我使用上面的AppendText方法时,我得到了
; Assembly comments
黑色代码与重新着色的文本完全相同。在这种情况下,我需要知道如何清除RTB中的行和/或覆盖那里的文本。我尝试过的所有选项都会删除这些行。
任何人,我确信这很长,但我真的很难过,非常感谢你的建议。
答案 0 :(得分:2)
我希望我能正确理解你。
这循环遍历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);