Today I set out to create a TextBox that would provide the user with a built-in prompt. I didn't want a TextBox control that included a Label. Instead, I wanted something akin to the password field in Windows Vista's logon screen; the field has the prompt built-into the TextBox in a faint, perhaps italic font when the control is empty. Once the user performs an action that causes text to appear (i.e., typing, pasting, etc) the faint prompt disappears to accommodate the text.
Now there may be tons of implementations of a similar control out there; I didn't look. Instead I wanted to 'reinvent the wheel' as it were and figure it out for myself. Fortunately it only cost me between 5 to 10 minutes and I had something up and working. The code I've included below is very raw and doesn't include many customizations (you're on your own there 
public sealed class PromptingTextBox : TextBox {
public PromptingTextBox() {
userPaint(true);
}
private Font _promptFont = new Font("Arial", 9.0F, FontStyle.Italic);
private string _promptText = "Enter text here...";
///
/// Sets or returns the text to display when the TextBox is empty.
///
public string PromptText {
get { return _promptText; }
set { _promptText = value; }
}
protected override void Dispose(bool disposing) {
if ( disposing )
_promptFont.Dispose();
base.Dispose(disposing);
}
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged(e);
userPaint(0 == TextLength);
}
private void userPaint(bool enabled) {
if ( enabled != GetStyle(ControlStyles.UserPaint) ) {
SetStyle(ControlStyles.UserPaint, enabled);
Refresh();
}
}
protected override void OnPaint(PaintEventArgs e) {
Graphics g = e.Graphics;
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
g.DrawString(_promptText, _promptFont, SystemBrushes.ControlLight, 0.0F, 0.0F);
}
}
That's all there is to it - at least for a simple start. Enjoy!