2011. 3. 17. 11:03ㆍCoders
그래서, TextBox를 상속받아 처리하는 코드를 구현해 보았습니다.
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace WithSoju { public class MyTextBox : TextBox { private const int WM_PASTE = 0x0302; private const int WM_CHAR = 0x102; private List<char> charNotAccept = new List<char>(); private string strNotAcceptList = string.Empty; private System.Windows.Forms.ToolTip errorTip;
public MyTextBox()
{
errorTip = new ToolTip();
errorTip.ToolTipTitle = "다음 문자들은 입력할 수 없습니다";
errorTip.ToolTipIcon = ToolTipIcon.Error;
}
/// <summary>
/// char 추가
/// </summary>
/// <param name="c">char</param>
public void AddNotAcceptChar(char c)
{
if (!charNotAccept.Contains(c))
{
charNotAccept.Add(c);
strNotAcceptList += " " + c.ToString();
strNotAcceptList = strNotAcceptList.TrimStart();
}
}
/// <summary>
/// char [] 추가
/// </summary>
/// <param name="cs">char []</param>
public void AddNotAcceptChar(char[] cs)
{
foreach (char c in cs)
AddNotAcceptChar(c);
}
/// <summary>
/// 문자열(string) 추가
/// </summary>
/// <param name="s">string</param>
public void AddNotAcceptChar(string s)
{
foreach (char c in s.ToCharArray())
AddNotAcceptChar(c);
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
//Copy N Paste 를 통제
if (m.Msg == WM_PASTE)
{
if (Clipboard.ContainsText())
{
if (!ErrorText(Clipboard.GetText(), true))
{
return;
}
}
}
//문자 입력을 통제
else if(m.Msg == WM_CHAR)
{
if (!ErrorText(((char)m.WParam).ToString(), true))
{
return;
}
}
base.WndProc(ref m);
}
/// <summary>
/// 거부할 문자를 체크하고 오류 메시지 뱉음
/// </summary>
/// <param name="charInput">입력된 문자</param>
/// <param name="bMessage">메시지 띄울지 여부</param>
/// <returns>허용되지 않는 값이면 false</returns>
private bool ErrorText(char charInput, bool bMessage)
{
try
{
if (charNotAccept.Contains(charInput))
{
if (bMessage)
{
errorTip.Show(strNotAcceptList, this, this.Left, this.Bottom, 3000);
}
return false;
}
return true;
}
catch (System.Exception ex)
{
throw ex;
}
}
/// <summary>
/// 거부할 문자열을 체크하고 오류 메시지 뱉음
/// </summary>
/// <param name="strInput">입력된 문자열</param>
/// <param name="bMessage">메시지 띄울지 여부</param>
/// <returns>허용되지 않는 값이면 false</returns>
private bool ErrorText(string strInput, bool bMessage)
{
try
{
foreach (char c in strInput)
{
if (!ErrorText(c, bMessage))
{
return false;
}
}
return true;
}
catch (System.Exception ex)
{
throw ex;
}
}
}
}
사용예 (폴더명으로 들어올 수 없는 문자를 걸러낼 경우) :
MyTextBox text = new MyTextBox();
text.AddNotAcceptChar("\\/:*?\"<>|");
//원래 다음과 같은 방식이어야 하는데요,
//먹어버리는(?) 문자열이 있어 메시지 띄우기가 애매하죠.
//textFolder.AddNotAcceptChar(System.IO.Path.GetInvalidFileNameChars());
'Coders' 카테고리의 다른 글
[MSSQL] INSERT/UPDATE/DELETE 트리거를 하나로 (0) | 2011.05.31 |
---|---|
[C#] TextBox 의 숫자 자릿수 통제 (3) | 2010.12.15 |
[Android] 텍스트 공유(Share) (6) | 2010.12.02 |