C# net WinForms当文本框处于焦点时,如何使文本框中的文本消失?
有没有一种方法,我可以创建浅灰色文本,当文本框处于焦点时消失 目前,我在文本框中写入了文本,但我必须选择文本并手动删除它(有点烦人…) 我知道我可以做一些事情,当我获得对框的关注(使用事件),但是,我不希望它清除文本,每次用户选择该框。。。而是第一次。换句话说,我只希望提示文本消失(而不是他们输入的文本,如果他们要在输入框一次后选择它)C# net WinForms当文本框处于焦点时,如何使文本框中的文本消失?,c#,.net,winforms,textbox,C#,.net,Winforms,Textbox,有没有一种方法,我可以创建浅灰色文本,当文本框处于焦点时消失 目前,我在文本框中写入了文本,但我必须选择文本并手动删除它(有点烦人…) 我知道我可以做一些事情,当我获得对框的关注(使用事件),但是,我不希望它清除文本,每次用户选择该框。。。而是第一次。换句话说,我只希望提示文本消失(而不是他们输入的文本,如果他们要在输入框一次后选择它) 我还意识到我可以使用计数器之类的东西来跟踪是否是第一次点击该框。。然而,我正在寻找一种更干净的方法来做到这一点 类似于下面的代码。 请注意,这不是一个编译代码。
我还意识到我可以使用计数器之类的东西来跟踪是否是第一次点击该框。。然而,我正在寻找一种更干净的方法来做到这一点 类似于下面的代码。 请注意,这不是一个编译代码。只是分享想法,如果用户没有输入任何文本,您可能希望保留默认设置。对于该句柄,将丢失焦点并重置为默认值
public class FancyTextBox : TextBox{
private bool _isDefaultText;
public FancyTextBox(){
UpdateDefaultSettings(true);
}
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
UpdateDefaultSettings(false);
}
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
if (String.IsNullOrEmpty(Text))
{
//Retain Default Setting.
UpdateDefaultSettings(true);
}
}
private void UpdateDefaultSettings(bool isDefault){
_isDefaultText = isDefault;
if(_isDefaultText){
Text = "Please enter";
this.ForeColor= Color.Gray;
}
else{
Text = "";
ForeColor = Color.Black;
}
}
}类似于下面的代码。 请注意,这不是一个编译代码。只是分享想法,如果用户没有输入任何文本,您可能希望保留默认设置。对于该句柄,将丢失焦点并重置为默认值
public class FancyTextBox : TextBox{
private bool _isDefaultText;
public FancyTextBox(){
UpdateDefaultSettings(true);
}
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
UpdateDefaultSettings(false);
}
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
if (String.IsNullOrEmpty(Text))
{
//Retain Default Setting.
UpdateDefaultSettings(true);
}
}
private void UpdateDefaultSettings(bool isDefault){
_isDefaultText = isDefault;
if(_isDefaultText){
Text = "Please enter";
this.ForeColor= Color.Gray;
}
else{
Text = "";
ForeColor = Color.Black;
}
}
}一个更简单的答案是
[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 SetHint(TextBox textBox, string hintText)
{
const uint EmSetCueBanner = 0x1501;
SendMessage(textBox.Handle, EmSetCueBanner, 0, hintText);
}
一个更简单的答案是
[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 SetHint(TextBox textBox, string hintText)
{
const uint EmSetCueBanner = 0x1501;
SendMessage(textBox.Handle, EmSetCueBanner, 0, hintText);
}
为focus添加一个事件侦听器,然后在第一次基于编辑调用它时将其删除。。。为什么不使用onform加载呢?@Tom Bass,是的,我想我可以这样做。我想我更多的是在思考如何在js中完成它,以及它有多干净。这是一行代码,它就是这样做的。很酷的一点是,当你点击这个框时(如果你没有输入任何内容),它会返回到提示文本。我也可以在这里做。。。但似乎应该有一个更干净的方法。感谢您的回复:)添加一个事件侦听器作为焦点,然后根据您的编辑在第一次调用它时将其删除。。。为什么不使用onform加载呢?@Tom Bass,是的,我想我可以这样做。我想我更多的是在思考如何在js中完成它,以及它有多干净。这是一行代码,它就是这样做的。很酷的一点是,当你点击这个框时(如果你没有输入任何内容),它会返回到提示文本。我也可以在这里做。。。但似乎应该有一个更干净的方法。感谢您的回复:)