Hackworth
Hackworth

Reputation: 1109

How do I display default text in EditControls?

What is the easiest way to recreate the effect where a text box displays a certain string (in italics and different font) until the user has clicked into the control and/or written his own text into the field? For an example, look at the "search" box at the top right of SO.

I have tried consuming the Paint event:

    private void textEdit1_Paint(object sender, PaintEventArgs e)
    {
        if (textEdit1.Text.Length == 0 && !textEdit1.Focused)
        {
            textEdit1.Font = new Font(textEdit1.Font, FontStyle.Italic);
            textEdit1.Text = "123";

        }
        else
        {
            textEdit1.Font = new Font(textEdit1.Font, FontStyle.Regular);
            textEdit1.Text = string.Empty;
        }
    }

However, that's not working. By default, it shows no text, and if I click into it, I seem to get an infinite loop of setting the text to "123" and string.empty, until I give another control focus.

So, is that approach even the best, and if yes, what's the correct 2nd condition instead of .Focused?

Upvotes: 1

Views: 898

Answers (3)

Sebi
Sebi

Reputation: 3979

You can use the Enter event. Set Text property to "search" for example. Use your font like others reported. Then catch the Enter event and set the Text property to string.empty.

textedit1.Text = "search";
private void textEdit1_Enter(object sender, EnterEventArgs e)
{
  textedit1.text = string.empty;
}

But i think the best practice is the NullValuePrompt.

Upvotes: 0

DmitryG
DmitryG

Reputation: 17848

Try the TextEdit.Properties.NullValuePrompt property. This property provides the text displayed grayed out when the editor doesn't have focus, and its edit value is not set to a valid value.

Upvotes: 1

Tibi
Tibi

Reputation: 3875

First of all, you shouldn't use the paint event, you should use the FocusChanged event if you want to do it by modifying the text property. However, the simplest method is not to modify the text property, but draw a string on top, like this:

private void textEdit1_Paint(object sender, PaintEventArgs e)
{
    if (textEdit1.Text.Length == 0 && !textEdit1.Focused)
    {
        Font some_font = new Font(...parameters go here...);
        Brush some_brush = Brushes.Gray; // Or whatever color you want
        PointF some_location = new PointF(5,5); // Where to write the string
        e.Graphics.WriteString("some text", some_font, some_brush, some_location);
    }
}

So, if there is no text, and text box is not focused, draw this string. There are many overloads of the WriteString function, so you can pick which one you want.

Upvotes: 0

Related Questions