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

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

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

这是我的计划的Screenshot.

我的代码

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

这样做,还是更需要?

解决方法

你怎么样将ToolTip分配给TextBox并将所有“对话是什么文本框”放在那里?

只需拖动和放大在Form中删除ToolTip.然后在每个TextBox属性中,你应该在toolTip1上的Misc部分ToolTip中有额外的条目(或者如果你重命名它的名字将是什么).

然后,当用户将鼠标悬停在TextBox上时(Read Only / disabled TextBox似乎不显示工具提示)并在那里停留1秒钟,ToolTip应显示正确的信息.

你最终甚至可以更好地在TextBox旁边有一个标签说明是什么,但是使用工具提示也是一个好主意,通过它向用户解释更多信息.

对于使用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,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",[MarshalAs(UnmanagedType.LPWStr)] string lParam);
    private void SetWatermark(string watermarkText) {
        SendMessage(Handle,watermarkText);
    }
}

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

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

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

编辑:

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

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...