A: 

.NET 2.0 Windows Forms already has that, and it's simply a MaskedTextBox.

But in order to provide maximum input validity such as email address, you can add regular expression (Regex) validation when the text in the MaskedTextBox is changed.

Update: To provide more customization such as multiple email address, you can also use MaskedTextBox combined with RichTextBox, since there's no native Windows Forms implementation of the exact functionality of Outlook email address input control.

I also have done this, by capturing user's current cursor when the RichTextBox control got focus, and then directly masking the input using additional MaskedTextBox generated on the fly at runtime, displayed on top of the RichTextBox. Therefore there can be multiple MaskedTextBoxes when the email addresses in entered more than one.

I'm not saying that this is an easy task, but this is doable.

See this:

MSDN documentation on MaskedTextBox

eriawan
That is completely not the same thing. I'm not seeing how you would use a MaskedTextBox to provide that sort of functionality. It would need to be something like an owner-drawn ListView of sorts.
Ryan Farley
You said in your question that you want this functionality on a textarea OR a list. MaskedTextBox is also a textarea.
eriawan
I used the words "text area" to describe what this control is in Outlook. The screenshot shows a list of addresses and the question describes a list of e-mail addresses, each one being a complete "item" of sorts in this list of addresses, which in Outlook is a text area, the user can also type there
Ryan Farley
Oh, now I get it. I've updated my answer.
eriawan
+1  A: 

Here's some code to get you started.

using System.Text;
using System.Windows.Forms;
using System;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            textBox1.Text = "[email protected]; [email protected]; [email protected]";
        }

        private void textBox1_Click(object sender, EventArgs e)
        {
            int nextSpaceIndex = textBox1.Text.Substring(textBox1.SelectionStart).IndexOf(' ');
            int firstSpaceIndex = textBox1.Text.Substring(0, textBox1.SelectionStart).LastIndexOf(' ');
            nextSpaceIndex = nextSpaceIndex == -1 ? textBox1.Text.Length : nextSpaceIndex + textBox1.SelectionStart;
            firstSpaceIndex = firstSpaceIndex == -1 ? 0 : firstSpaceIndex;
            textBox1.SelectionStart = firstSpaceIndex;
            textBox1.SelectionLength = nextSpaceIndex - firstSpaceIndex;
        }
    }
}

This will, when you click on an email address, select the entire email address. I'm not sure if this is the functionality you're going for (it sounds like it is, though), but it'll get you started. If you want to do other things beyond having click functionality, hook into the other events offered by TextBox.

impulse3d
I ended up going a similar route. Thanks for the comment.
Ryan Farley