2012-08-16 109 views
1

我有一个多行TextBox,我显示的应用程序日志。如果长度大于1k个字符,我会记录日志。问题在于闪烁。如果数据不同,我使用定时器控件来更新带有条件的文本框。C#文本框停止闪烁

任何方法?还是有更好的方式来显示日志?谢谢!

// this is inside timer 
if(txt_log.Text != MY_LOG_VAR){ 
    txt_log.Text = MY_LOG_VAR; 
} 

// function to update log 
public void Log(string data){ 

    MY_LOG_VAR = data + "\r\n" + MY_LOG_VAR; 

    if(MY_LOG_VAR.Length > 1000){ 
    substr... 
    } 
} 

日志功能可以被称为第二偶数20次时,定时器的时间间隔被设定为100秒;

它不闪烁。但是,如果大量的数据被提交给它的日志,我需要一个解决办法,让文本框甚至可以说全屏和不闪烁..谢谢!

+3

请出示你在那里更新文本框 – Steve 2012-08-16 13:06:58

+0

的代码,你设定每次text属性? – 2012-08-16 13:09:00

+0

您是否在每次输入内容时都进行> 1000检查?如果是的话,你正在处理什么事件呢?我怀疑它是错误的......并且在这种情况下计时器听起来不正确。 – PeteH 2012-08-16 13:13:01

回答

1

你应该尝试使用TextBox.AppendText而不是替换您的文本框的全部内容。

// function to update log 
public void Log(string data) 
{ 
    textBox1.AppendText(data + "\r\n"); 
    MY_LOG_VAR = data + "\r\n" + MY_LOG_VAR; 

} 

这是不一样的把新的文本中前一个的前面,但我认为应该停止闪烁。 我已经做了一些试验用一个RichTextBox并没有在所有 (完全是汉斯帕桑特在其回答说)无闪烁......

例如,滚动无闪烁

richTextBox1.AppendText(data +"\n"); 
richTextBox1.SelectionStart = richTextBox1.GetFirstCharIndexFromLine(richTextBox1.Lines.Count()-1); 
richTextBox1.ScrollToCaret(); 
+0

谢谢,工作! :) – Kristian 2012-08-16 13:40:23

2

有ISN” t您可以对TextBox绘制的方式做任何事情。它犯了一些罪,比如在没有WM_PAINT的情况下绘制,在1985年时它必须在严格受限的硬件上运行,这很重要。 1K字符相当低端,64K是一个不错的圆形数字,可以减少闪烁。并且一定要在两者之间使用AppendText。

除此之外,也考虑的RichTextBox来代替。它是双缓冲区,并有更好的方式来使文本只读。

+0

感谢您的提示! – Kristian 2012-08-16 13:39:54

0

您是否尝试过与周围的文本框调用的BeginUpdate/EndUpdate更新吗?