如何在C#Winforms程序的文本框中突出显示文本?

时间:2010-03-09 21:23:54

标签: c# winforms textbox highlight

我有一个带有多个文本框的C#Winforms程序。我使用每个框的属性在其中放置文本,向用户解释其中的值。每当用户选择该框时,我希望文本突出显示。通过Tab键或鼠标单击。如果有办法显示文本框中除了它之外的某个值,我就不必这样做了。

我尝试了Textbox.select方法,但没有效果。与this相同。

这是我的计划的Screenshot

我的代码:

    private void grapplingText1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
    {
        grapplingText1.SelectionStart = 0;
        grapplingText1.SelectionLength = grapplingText1.Text.Length;

这样做,还是更需要?

7 个答案:

答案 0 :(得分:8)

如何将ToolTip分配给TextBox并将所有“谈论什么文本框”放在其中?

只需拖动&在表单中删除ToolTip。然后在每个TextBox属性中,您应该在ToolTip上的杂项部分toolTip1中添加其他条目(或者如果您重命名它将是其名称)。

然后,当用户将鼠标悬停在TextBox上时(只读/已禁用TextBox似乎无法显示工具提示)并停在那里1秒钟,工具提示应显示正确的信息。

您最终或者甚至可以更好地Label旁边的TextBox说明是什么,但拥有ToolTip也是一个好主意,通过它向用户解释更多信息。

为了使用WaterMark进行操作,所以你不需要通过设置事件来完成任务,照顾SelectAll等你可以这样做。创建新的watermark.cs文件并将其替换为此代码。确保已更改名称空间以匹配程序名称空间。

#region
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

#endregion

namespace Watermark {
    public static class TextBoxWatermarkExtensionMethod {
        private const uint ECM_FIRST = 0x1500;
        private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
        public static void SetWatermark(this TextBox textBox, string watermarkText) {
            SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText);
        }
    }
}
   internal class WatermarkTextBox : TextBox {
    private const uint ECM_FIRST = 0x1500;
    private const uint EM_SETCUEBANNER = ECM_FIRST + 1;
    private string watermarkText;
    public string WatermarkText {
        get { return watermarkText; }
        set {
            watermarkText = value;
            SetWatermark(watermarkText);
        }
    }
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);
    private void SetWatermark(string watermarkText) {
        SendMessage(Handle, EM_SETCUEBANNER, 0, watermarkText);
    }
}

在您的表单中,您可以像这样激活它:

textBoxYourWhatever.SetWatermark("Text that should display");

只要TextBox为空,它就会一直存在。当用户进入TextBox文本消失时。当TextBox被清除(由用户或自动)时,它会再次出现。不需要任何特殊活动等。

编辑:

我还添加了内部类WaterMarkTextBox,它为您提供了一个选项,可以简单地使用Designer中可用的新WaterMarkTexBox。然后将其拖放到您的设计器并使用它。它的行为与普通文本框一样,只为您提供了额外的字段WaterMarkText。

我还是喜欢第一种方法。不会让你再次重建你的gui。

答案 1 :(得分:7)

我认为如果您知道要选择的文本金额,.select将起作用。

尝试.SelectAll();它应该适合你

答案 2 :(得分:3)

你需要使用TextBox.Focus()来关注你的控件,如果不能自动工作,那么只需在Enter()事件上调用SelectAll()方法。

private TextBox1_Enter(object sender, EventArgs e) {    
    TextBoxTextHighlight(sender, null);
}

private TextBox2_Enter(object sender, EventArgs e) {
    TextBoxTextHighlight(sender, null);
}

private TextBox3_Enter(object sender, EventArgs e) {
    TextBoxTextHighlight(sender, null);
}

// And so forth...

private void TextBoxTextHighlight(object sender, EventArgs e) {
    (sender as TextBox).SelectAll();
}

此方法允许您从任何TextBoxX_Enter()事件处理程序调用它。

否则,您甚至可以创建一个新的UserControl,在创建时调用它,然后,当创建到项目中时,编辑代码并用TextBox类替换UserControl类的继承,然后在其中定义默认值您希望在Enter()事件上拥有的行为,例如对SelectAll()方法的调用,并使其成为受保护的虚拟行为,并且在构造函数中,您可以像这样订阅事件处理程序:

public partial class CustomTextBox : TextBox {
    public CustomTextBox() 
        : base() {
        this.Enter += new EventHandler(Enter);
    }

    protected virtual Enter(object sender, EventArgs e) {
        this.SelectAll();
    }
}

我是在飞行中写的,所以也许需要进行一些修改,但你可能会得到这个想法。但我不建议你这样做,除非它真的值得为你的正常情况做这件事。越简单越好,最简单的方法是为每个表单的TextBox创建一个事件处理程序,然后调用TextBoxTextHighlight()方法。

答案 3 :(得分:2)

假设您的文本框名称是'MyTextBox'

您可以编写处理Focus事件的方法:

private void MyTextBox_GotFocus(object sender, EventArgs e)
{
    MyTextBox.SelectionStart = 0;
    MyTextBox.SelectionLength = MyTextBox.Text.Length;
    MyTextBox.Select();
}

您还需要添加事件处理程序:

this.MyTextBox.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);

这应该有用......

修改

您可以对其他文本框使用相同的方法,只需添加事件处理程序:

this.MyTextBox2.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
this.MyTextBox3.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
this.MyTextBox4.GotFocus += new System.EventHandler(this.MyTextBox_GotFocus);
//...

答案 4 :(得分:2)

通常情况下,如果您想向用户说明文本框中 的内容,请在其上方放置Label控件,(或者侧)。

有时候,为了节省屏幕空间,您可以在文本框本身的里面添加文本的描述。这称为watermark

答案 5 :(得分:0)

将鼠标悬停在某个项目上时显示其他信息的最简单方法是使用工具提示。我尝试了类似的水印方法,但发现没有直接的方法来实现它,Tooltip似乎是一个合适的选择。

您可以在以下链接中查看如何实现它: Implementing a tooltip

答案 6 :(得分:-1)

我发现在我的应用程序中,将高亮方法附加到Focus - >使用SelectAll()方法输入事件不能很好地工作。我改为使用Action - >点击(我相信只适用于老鼠)并在那里附加我的突出显示方法。现在它就像一个魅力。