创建一个可以快速更新的无闪烁文本框

时间:2010-01-15 15:22:26

标签: c# textbox winforms

我正在尝试创建一个搜索工具,并希望在文本框中显示结果,就像Visual Studio中包含的那样 - 这意味着对于长搜索,结果将附加到文本框的末尾当用户试图查看文本框顶部的结果时。

目前我正在使用标准文本框,但它存在许多问题:

  • 搜索正在进行时,文本框疯狂地闪烁
  • 当结果被添加到框中时,用户无法滚动
  • 在添加结果时,用户无法在结果文本框中复制和粘贴结果。

有没有办法解决这些问题,还是应该考虑使用其他控件/创建自己的控件?

3 个答案:

答案 0 :(得分:3)

首先在搜索运行时访问TextBox,您应该将搜索放入BackgroundWorker,并将带有BeginInvoke()的(中间)结果放入TextBox中。因此,当您的搜索正在运行时,您的GUI不会挂起。

此外,您应该使用TextBox.AppendText()方法将文字添加到您的框中。如果你想要自动滚动,请在AppendText之后使用下面的两个衬垫:

textBoxMessages.SelectionStart = textBoxMessages.Text.Length;
textBoxMessages.ScrollToCaret();

如果你想启用/禁用自动滚动,你可以在AppendText之前检查SelectionStart是否等于Text.Lenght,并且只有当这是真的时才在AppendText之后制作上面的两个衬垫

更新

好的,要摆脱 闪烁,文本框中没有真正的解决方案。当我提到正确的时候,你可以尝试使用RichTextBox,因为它可以更好地解决这些滚动问题。

最后但并非最不重要的是,您可以使用ScintillaNET。我已经多次使用它,为了这些目的,它解决了所有问题。

ScintillaNet(或者Scintilla更好)你唯一不能做的就是手动着色自定义部分。您总是使用词法分析器,它在关键字列表中使用预定义的格式。

答案 1 :(得分:2)

Microsoft忘记为TextBox实现Begin / EndUpdate()方法。您可以自己添加它们,它可以解决问题。你不能摆脱闪烁。示例代码:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            timer1.Interval = 10;
            timer1.Tick += new EventHandler(timer1_Tick);
            button1.Click += new EventHandler(button1_Click);
        }
        void timer1_Tick(object sender, EventArgs e) {
            int pos = textBox1.SelectionStart;
            int len = textBox1.SelectionLength;
            SendMessage(textBox1.Handle, 11, IntPtr.Zero, IntPtr.Zero);
            textBox1.AppendText(DateTime.Now.ToString() + Environment.NewLine);
            SendMessage(textBox1.Handle, 11, (IntPtr)1, IntPtr.Zero);
            //if (textBox1 is RichTextBox) textBox1.Invalidate();
            textBox1.SelectionStart = pos;
            textBox1.SelectionLength = len;
        }
        private void button1_Click(object sender, EventArgs e) {
            timer1.Enabled = !timer1.Enabled;
        }
        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    }
}

答案 2 :(得分:1)

文本框适用于可编辑内容 - 搜索结果是否可编辑?

如果您要将结果显示给搜索,为什么不使用DataGrid?你可以将它设计成你想要的样子(它可以看起来像一个带有行和文本行的文本框