7

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

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

这是我的程序的屏幕截图

我的代码:

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

这会做,还是更需要?

4

7 回答 7

8

您如何分配ToolTip并将TextBox所有“谈论文本框的用途”放在其中?

ToolTip只需在表单内拖放即可。然后在每个TextBox属性中,您应该在“杂项”部分中添加额外的条目ToolTiptoolTip1或者如果您重命名它,它的名称将是什么)。

然后,当用户将鼠标悬停在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。

于 2010-03-09T22:05:50.613 回答
7

如果您知道要选择的文本数量,我认为 .select 会起作用。

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

于 2010-03-09T21:30:55.380 回答
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();
    }
}

我是即时编写的,因此可能需要进行一些修改,但您可能会明白。但我不建议你这样做,除非它真的适合你的情况。越简单越好,最简单的方法是为表单的每个 TextBoxes 创建一个事件处理程序,然后调用 TextBoxTextHighlight() 方法。

于 2010-03-09T21:30:58.047 回答
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);
//...
于 2010-03-09T21:34:00.460 回答
2

通常,如果您想向用户解释文本框中的内容,您可以文本框的正上方(或旁边)放置一个Label控件。

但有时,为了节省屏幕空间,您可以将文本描述放在文本框本身内。这称为水印

于 2010-03-09T22:02:45.290 回答
0

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

您可以在以下链接中查看如何实现它: 实现工具提示

于 2010-03-10T01:04:51.793 回答
-1

我发现在我的应用程序中,将 highlight 方法附​​加到 Focus -> Enter 事件与 SelectAll() 方法效果不佳。我改为使用 Action -> Click (我相信它只适用于老鼠)并在那里附加我的突出显示方法。现在它就像一个魅力。

于 2014-10-29T18:21:52.090 回答