Я пытался сделать это в событии backgroundworker_ProgressChanged
, но в некоторых местах текста он выделен красным цветом, и я не увидел в этих областях слова "Ошибка".
Что я делаю не так?
Это часть кода, где я пытаюсь раскрасить слово «Ошибка» в любом месте текста. Я хочу нарисовать каждое место в тексте, где есть слово «Ошибка» и только слово «Ошибка», и после того, как я хочу нарисовать всю строку, где есть слово «Ошибка».
void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.richTextBox1.AppendText(e.UserState.ToString());
if (e.UserState.ToString().Contains("Error"))
{
Invoke(new Action(() => richTextBox1.SelectionColor = Color.Red));
}
}
И это полный код новой формы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class textBoxLoggerViewer : Form
{
//all the text-lines
string[] allText;
//counter
int lineCounter = 0;
//amount of lines to display
private int maxDisplayAmount = 2000;
string log_file_name = @"\logger.txt";
string logger_file_to_read = Path.GetDirectoryName(Application.LocalUserAppDataPath) + @"\log";
//string logger_file_to_read = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
BackgroundWorker bgw = null;
public textBoxLoggerViewer()
{
InitializeComponent();
label1.Text = "Loading text please wait";
richTextBox1.Font = new Font("Consolas", 8f, FontStyle.Bold);
richTextBox1.BackColor = Color.AliceBlue;
richTextBox1.SelectionColor = Color.Black;
richTextBox1.DoubleClick += new EventHandler(richTextBox1_DoubleClick);
richTextBox1.Enabled = false;
this.Shown += new EventHandler(textBoxLoggerViewer_Shown);
bgw = new BackgroundWorker();
bgw.WorkerReportsProgress = true;
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
this.FormClosed += new FormClosedEventHandler(textBoxLoggerViewer_FormClosed);
}
void textBoxLoggerViewer_FormClosed(object sender, FormClosedEventArgs e)
{
this.bgw.Dispose();
}
void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.richTextBox1.AppendText(e.UserState.ToString());
if (e.UserState.ToString().Contains("Error"))
{
Invoke(new Action(() => richTextBox1.SelectionColor = Color.Red));
}
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
this.allText = File.ReadAllLines(logger_file_to_read + log_file_name);
while (lineCounter < allText.Length - 1)
{
string current = ReadText();
//get current amount in percent
bgw.ReportProgress((int)(((double)this.lineCounter / (double)allText.Length) * 100), current);
}
}
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.richTextBox1.Enabled = true;
progressBar1.Enabled = false;
progressBar1.Visible = false;
label1.Text = "All the text have been loaded successfully";
}
void textBoxLoggerViewer_Shown(object sender, EventArgs e)
{
bgw.RunWorkerAsync();
}
void richTextBox1_DoubleClick(object sender, EventArgs e)
{
ReadText();
}
//will be called from bgw
private string ReadText()
{
StringBuilder sb = new StringBuilder();
int curLine = lineCounter;
for (int i = curLine; i < Math.Min(curLine + maxDisplayAmount, allText.Length); i++)
{
sb.Append(i.ToString() + "\t\t" + allText[i] + "\r\n");
lineCounter++;
/* if (allText[i].Contains("Error"))
{
Invoke(new Action(() => richTextBox1.SelectionColor = Color.Red));
}*/
}
return sb.ToString();
}
}
}
Кстати: я хотел добавить на индикатор выполнения «%» с числами, чтобы, когда индикатор выполнения находился в процессе, он считал проценты и показывал их теперь, просто показывая эту зеленую полосу, которую я хочу в передней части зеленой полосы, чтобы показать проценты. как% 1% 2% 3 или 1% 2% 3% или без «%», я не знаю, как это сделать, но многие способы не сработали.
Спасибо.