[C#] 특정 문자열을 막는 코드

2011. 3. 17. 11:03Coders

뭔가 좀 하다가, 폴더명에 올 수 없는 문자열을 TextBox 에서 튕겨내야하는 작업이 있었습니다. 그냥 문자열의 입력이야 KeyPress 이벤트 핸들러를 통해 통제할 수 있지만, CopyNpaste 로 붙이는 값에 대해서는 통제하기가 좀 애매하더군요.(Ctrl+P 의 조합은 통제할 수 있지만, 마우스 오른쪽 버튼을 통한 붙이기를 막지는 못합니다.)


그래서, 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