星期三, 九月 10, 2008

Char Validation Text Box with error tooltip

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

///
/// Show tooltip and prevent user input invalid characters defined in char[]
/// Need to hookup Container.OnMove, [MouseEnter] to HideTooltip
///
public class CharValidationTextBox : TextBox
{
private char[] INVALID_CHARS = new char[] { '\\', '/', ':', '*', '?', '\"', '<', '>', '|' };
private string WARNING = "A prefix cannot contain any of the following characters:\r\n\t";
private ToolTip _tooltip = new ToolTip();
private bool _first = true;

public CharValidationTextBox()
{
SetTooltip();
}

public CharValidationTextBox(string invalid_chars)
{
INVALID_CHARS = invalid_chars.ToCharArray();

SetTooltip();
}

private void SetTooltip()
{
WARNING += charsToString(INVALID_CHARS);

_tooltip.IsBalloon = true;

KeyDown += new KeyEventHandler(CharValidationTextBox_KeyDown);
KeyPress += new KeyPressEventHandler(CharValidationTextBox_KeyPress);
LostFocus += new EventHandler(CharValidationTextBox_LostFocus);
}

private void FixArrowAlign()
{
_tooltip.Active = false;
_tooltip.SetToolTip(this, WARNING);
_tooltip.Active = true;
_tooltip.SetToolTip(this, string.Empty);
}

public static string charsToString(char[] chars)
{
StringBuilder builder = new StringBuilder(chars.Length);
foreach (char ch in chars)
{
builder.Append(ch);
builder.Append(' ');
}
return builder.ToString();
}

public void HideToolTip()
{
_tooltip.Hide(this);
}

public void ShowToolTip()
{
if (_first)
{
FixArrowAlign();
_first = false;
}

_tooltip.Show(WARNING, this, Width / 2, Height / 2, _tooltip.AutoPopDelay);
}

void CharValidationTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
foreach (char ch in INVALID_CHARS)
{
if (ch == e.KeyChar)
{
ShowToolTip();
e.Handled = true;
break;
}
}
}

void CharValidationTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.V)
{
string text = Clipboard.GetText();
if (text.IndexOfAny(INVALID_CHARS) >= 0)
{
ShowToolTip();
e.SuppressKeyPress = true;
}
}
}

void CharValidationTextBox_LostFocus(object sender, EventArgs e)
{
HideToolTip();
}
}


没有评论:

发表评论