Visual C#.NET:
private void tbAddress_GotFocus()
{
tbAddress.Text = "";
}
private void tbAddress_LostFocus()
{
if (tbAddress.Text == "") { tbAddress.Text = "Email Address"; }
}
所以,我正在尝试使用该代码来使它在(Windows窗体)文本框中有文本,然后当文本框获得焦点时(当用户在其中单击时),文本消失。这样,它看起来就像是一个带有文本框内标签的表单。
那么,为什么代码不起作用,还是有更好的方法呢?
答案 0 :(得分:4)
这是一个关于如何在文本框中进行水印的教程。
http://vidmar.net/weblog/archive/2008/11/05/watermarked-textbox-in-windows-forms-on-.net.aspx
答案 1 :(得分:2)
使用textBox1.GotFocus
事件
textBox1.GotFocus += textBox1_GotFocus;//at the designer, constructor or form load...
private void textBox1_GotFocus(object sender, EventArgs e)
{
textBox1.Clear();//clear the text.
}
//更新:
如果您已经这样做了,那么问题必须在其他地方,这段代码应该没有任何问题。
答案 2 :(得分:2)
+1到@RexM指向最简单,可能是最佳答案的指针。
这是一个更复杂的方法,它基于this answer的想法。它允许自定义显示文本的颜色,但它可能还有其他一些问题。
我真的建议使用RexM的答案。无论如何,作为参考,这是另一种方法的代码:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace MyControls
{
public class HintedTextBox : TextBox
{
public HintedTextBox() : base() { ResetHintColor(); }
[Description("The color of the hint text to display"),
Category("Appearance")]
public Color HintColor { get; set; }
// Default value handling for HintColor
private Color DefaultHintColor { get { return Color.LightGray; } }
public void ResetHintColor() { HintColor = Color.LightGray; }
public bool ShouldSerializeHintColor() { return !HintColor.Equals(DefaultHintColor); }
[Description("The textual hint to display in the textbox"),
Category("Behavior"),
Localizable(true)]
public string HintText
{
get { return m_hintText; }
set
{
if (m_hintText != value)
{
m_hintText = value;
UpdateHintTextState(true);
}
}
}
private string m_hintText = "";
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
HasFocus = true;
UpdateHintTextState();
}
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
HasFocus = false;
UpdateHintTextState();
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
UpdateHintTextState();
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 15) // WM_PAINT
{
PaintHintText();
}
}
private bool DisplayHintText { get; set; }
private bool HasFocus { get; set; }
private void PaintHintText()
{
if (DisplayHintText)
{
using (Graphics g = Graphics.FromHwnd(this.Handle))
using (SolidBrush b = new SolidBrush(HintColor))
{
StringFormat sf = new StringFormat();
switch (this.TextAlign)
{
case HorizontalAlignment.Center:
sf.Alignment = StringAlignment.Center;
break;
case HorizontalAlignment.Right:
sf.Alignment = StringAlignment.Far;
break;
default:
sf.Alignment = StringAlignment.Near;
break;
}
g.DrawString(HintText, Font, b, ClientRectangle, sf);
}
}
}
private void UpdateHintTextState() { UpdateHintTextState(false); }
private void UpdateHintTextState(bool forceInvalidate)
{
bool prevState = DisplayHintText;
if (HintText.Length == 0)
DisplayHintText = false;
else if (Text.Length != 0)
DisplayHintText = false;
else
DisplayHintText = !HasFocus;
if (DisplayHintText != prevState || forceInvalidate)
Invalidate();
}
}
}
答案 3 :(得分:1)
它不起作用,因为默认情况下文本框不会触发回发,如果没有回发,服务器端事件就不会处理。
这里你最好的选择是使用客户端javascript来处理这个功能 - 因为在每个文本框事件上向服务器的往返是浪费的,并且对用户来说很烦人。