代码的作用就是打开一个TXT文件,将文件内容写入richTextBox中,并将符合正则表达式的字符改变颜色。
private void open_Click(object sender, EventArgs e)//打开文件
{
this.richTextBox1.Clear();//清空
Encoding gb2312 = Encoding.GetEncoding("gb2312"); OpenFileDialog openFile = new OpenFileDialog();
if (openFile.ShowDialog() == DialogResult.OK)
{
textBox3.Text = openFile.FileName;//保存文件路径
}
richTextBox1.Text = regex2.Replace(File.ReadAllText(openFile.FileName, gb2312), "");//将文件用指定的编码输出,同时用正则去掉空格和换行
ManagerText(richTextBox1.Text,richTextBox1.Text.Length);
}
public void ManagerText(string txt,int txtLength) //处理richTextBox1中的文本,符合正则表达式的就改变颜色
{
for (int i = 0; i < txtLength; i++)
{
string[] result = regex.Split(txt, 2, i);
int m = result[0].Length;
MySelect(richTextBox1, m, Color.Red, true);//改变颜色
}
}
public static void MySelect(System.Windows.Forms.RichTextBox tb,int m, Color c,bool font)//改变颜色
{
tb.Select(m, 1);
tb.SelectionColor = c;
if (font)
tb.SelectionFont = new Font("宋体", 10, (FontStyle.Bold));
else
tb.SelectionFont = new Font("宋体", 10, (FontStyle.Regular));
}
在上面的代码中,如果打开的TXT文件字数太多的话,界面会卡住。初步确认是在改变字体颜色的时候发生,现在我想用多线程来处理改变字符的颜色。不知道该如何处理。求高人支招!!
比较简单的方法,拖个BackgroundWoker组件,然后把读数据放到该组件的异步任务中,
1, 每次读取一行 ReadLine 这样就省掉了用正则去换行的操作;
2,将读取的一行用正则去掉空格;
3,将去掉空格的一行追加到RichTextBox中;
4,Thread.Sleep() 休息一下,让UI处理下RichTextBox的绘制.
5,回到1;
最简单的
ThreadPool.QueueWorkItem((state)=>
{
string text = regex2.Replace(File.ReadAllText(openFile.FileName, gb2312), "");
//`````回调更新控件
});