我正在尝试创建一个搜索工具,并希望在文本框中显示结果,就像Visual Studio中包含的那样 - 这意味着对于长搜索,结果将附加到文本框的末尾当用户试图查看文本框顶部的结果时。
目前我正在使用标准文本框,但它存在许多问题:
有没有办法解决这些问题,还是应该考虑使用其他控件/创建自己的控件?
答案 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?你可以将它设计成你想要的样子(它可以看起来像一个带有行和文本行的文本框)