本帖最后由 lookat 于 2024-1-20 07:51 编辑
睡醒试了试那代码容易出现死循环转发至richtextbox中
链接:https://www.52pojie.cn/thread-1882186-1-1.html
C#控制台内容重定向到richTextBox中
不过没关系有解决办法
首先是这俩自定义的方法
加这俩方法就是可以以防万一了
[C#] 纯文本查看 复制代码
//关闭rich文本改动检测
private void DisableTextChangedEvent(RichTextBox richTextBox)
{
richTextBox.TextChanged -= richTextBox1_TextChanged;
}
//开启rich文本改动检测
private void EnableTextChangedEvent(RichTextBox richTextBox)
{
richTextBox.TextChanged += richTextBox1_TextChanged;
}
具体使用就是
[C#] 纯文本查看 复制代码
//rich字数检测
private void RichStartIndexLength(RichTextBox richTextBox)
{
//(因为我的richTextBox1_TextChanged里面有好多Console.WriteLine所以就给下面修改内容时套了个禁用)
//就是修改文本时给禁用就不会触发了
//根据实际情况用别的办法也行,反正办法很多
/////////////这种使用格式//////////////////
//DisableTextChangedEvent(richTextBox);
//Console.WriteLine("启用字数检测");
//EnableTextChangedEvent(richTextBox);
// 获取RichTextBox1的最大字符数量
toolStripStatusLabel3.Text = richTextBox.MaxLength.ToString();
// 获取RichTextBox1的当前字符数量
toolStripStatusLabel5.Text = richTextBox.Text.Length.ToString();
// 计算当前字符数量占最大字符数量的百分比
double percentage = Math.Round((double)richTextBox.Text.Length / richTextBox.MaxLength * 100, 2);
// 检查是否达到最大值的70%
if (percentage >= 70 && percentage <= 90)
{
// 字体颜色变为橘黄色
toolStripStatusLabel4.ForeColor = Color.Orange;
toolStripStatusLabel5.ForeColor = Color.Orange;
}
// 检查是否达到最大值的90%
else if (percentage >= 90)
{
// 字体颜色变为红色
toolStripStatusLabel4.ForeColor = Color.Red;
toolStripStatusLabel5.ForeColor = Color.Red;
}
// 否则,字体颜色恢复为默认颜色
else
{
toolStripStatusLabel4.ForeColor = Color.Green;
toolStripStatusLabel5.ForeColor = Color.Green;
}
// 获取当前文本
string text = richTextBox.Text;
// 检查文本长度是否超过最大值
DisableTextChangedEvent(richTextBox);
while (text.Length > richTextBox.MaxLength)
{
int endOfFirstLine = text.IndexOf("\n");
if (endOfFirstLine == -1)
{
// 如果没有找到换行符,说明只有一行,直接截断
richTextBox.Text = text.Substring(0, richTextBox.MaxLength);
break;
}
else
{
// 删除第一行
text = text.Remove(0, endOfFirstLine + 1);
richTextBox.Text = text;
}
}
EnableTextChangedEvent(richTextBox);
}
就是先把文字检测从richTextBox1_TextChanged里面剥离出来
然后加上这俩方法就可以避免了
如果想修改文本不触发TextChanged事件
可以在修改文本之前临时禁用TextChanged事件 修改后重新启用它
然后就是在load窗口时加入计时器方法调用
[C#] 纯文本查看 复制代码
// 字数检测计时器
private System.Windows.Forms.Timer _richBox1_timer;
private void RichTimeStart()
{
_richBox1_timer = new System.Windows.Forms.Timer();
_richBox1_timer.Interval = 1000; // 1秒
_richBox1_timer.Tick += new EventHandler(OnTimedEvent);
_richBox1_timer.Start();
}
private void OnTimedEvent(Object myObject, EventArgs myEventArgs)
{
AutoMethod();
}
private void AutoMethod()
{
RichStartIndexLength(richTextBox1);
}
|