Blu*_*ppy 2 c# richtextbox backgroundworker winforms
我有一个小应用程序读取管道分隔文件并将行写入RTB,突出显示某些"列"中是否有不允许的字符.这是完美的工作......然而,用户想要一个进度条,并看到"现场"写的行,也能够在中途取消.
我有以下扩展方法,我一直用来写入RichTextBox,同时阻止UI,但这使用BackgroundWorker与BeginInvoke失败.
失败是找到文本的当前长度.
public static void AppendLine(this RichTextBox richTextBox, string text, List<Char> foundChars, List<int> columns)
{
var split = text.Trim().Split(new char[] { '|' });
for (int i = 0; i < split.Count(); i++)
{
**var start = richTextBox.TextLength;**
richTextBox.AppendText(split[i]);
var end = richTextBox.TextLength;
if (columns.Contains(i + 1))
{
foreach (var foundChar in foundChars)
{
var current = start;
while (current > 0)
{
var position = richTextBox.Find(new char[] { foundChar }, current, end);
current = position + 1;
if (current > 0)
{
richTextBox.Select(position, 1);
richTextBox.SelectionColor = Color.Red;
}
}
}
}
richTextBox.SelectionLength = 0;
richTextBox.SelectionColor = Color.Black;
}
richTextBox.AppendLine();
}
Run Code Online (Sandbox Code Playgroud)
private void UpdateResultsLine(string line, List<char> foundChars)
{
if (txtResults.InvokeRequired)
{
txtResults.BeginInvoke(new UpdateResultsLineDelegate(UpdateResultsLine), line, foundChars);
}
txtResults.AppendLine(line, foundChars, _fileType.ProcessColumns);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我以相同的方式调用任何/所有这些扩展,它们可以工作吗?
public static void AppendLine(this RichTextBox richTextBox)
{
richTextBox.AppendText(Environment.NewLine);
}
public static void AppendLine(this RichTextBox richTextBox, string text)
{
richTextBox.AppendText(text + Environment.NewLine);
}
public static void AppendLine(this RichTextBox richTextBox, string text, params object[] args)
{
richTextBox.AppendLine(string.Format(text, args));
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?或者是否有另一种方法可以将彩色文本写入RTB?
在这里你可以尝试,创建扩展类如下
public static class ControlExtensions
{
public static void Invoke(this Control control, Action action)
{
if (control.InvokeRequired) control.Invoke(new MethodInvoker(action), null);
else action.Invoke();
}
}
Run Code Online (Sandbox Code Playgroud)
无论何时何地,您都希望在UI上更新任何内容,您只需要这样做
richTextBox.Invoke(() => { richTextBox.AppendText(text + Environment.NewLine); });
Run Code Online (Sandbox Code Playgroud)
希望这对你有用.