DataGridView의 특정 Column에 자동완성 기능을 추가할 때는 아래와 같이 진행하시면 됩니다.

 

특정 Column이 셀 편집을 시작한다면, 내부의 TextBox Control의 AutoCompleteMode를 지정하면 됩니다.

 

 

 

 

 

AutoCompleteStringCollection auto = new AutoCompleteStringCollection();

 
string[] hints = new string[] { "Hint0""Hint1""Hint2""Hint3" };
auto.AddRange(hints);
 
this.dgvView.EditingControlShowing += 
       new DataGridViewEditingControlShowingEventHandler(dgvView_EditingControlShowing);

 

 

 

 

void dgvView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

{
    int column = this.dgvView.CurrentCell.ColumnIndex;
    string headerText = this.dgvView.Columns[column].Name;
 
    if (headerText.Equals("chName"))
    {
        TextBox tb = e.Control as TextBox;
 
        if (tb != null)
        {
            tb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            tb.AutoCompleteCustomSource = auto;
            tb.AutoCompleteSource = AutoCompleteSource.CustomSource;
        }
 
    } 
}

 

 

저는 event 예외 처리 할 때 아래와 같이 진행해왔었습니다.

SomethingEvent 이벤트를 아무도 등록하지 않았을때의 예외처리입니다.

 

 

 

public event EventHandler SomethingEvent;

 

        public void RaiseSomethingEvent()

        {

            if (this.SomethingEvent != null)

                this.SomethingEvent(null,null);

        } 

 

 

 

 

아래와 같이 빈 delegate를 이용하면 null이 아니기 때문에 event를 등록한 개체가 없더라도 예외가 발생하지 않습니다.

멀티쓰레드 환경도 기존의 코드와 달리 null 체크를 하지 않기 때문에 아무런 문제없이 잘동작합니다.

 

 

public event EventHandler SomethingEvent = delegate { };

 

        public void RaiseSomethingEvent()

        {

            this.SomethingEvent(null,null);

        } 

 

 

 

아래의 코드도 동일하게 잘 동작합니다.

 

 

 

public event Action<string> SomethingEvent = delegate { };

 

        public void RaiseSomethingEvent()

        {

            this.SomethingEvent("foo");

        }

 

 

 

참고 : Pro Wpf and Silverlight MVVM - Chapter 5. Event and Commands (112p)

타 프로세스에 메세지를 전송하는 방법은 여러가지가 있겠지만,

 

2개의 Winform 프로그램에서 SendMessage 함수를 이용해 타 프로세스에 문자열 메세지를 전송하는 방법을 포스팅하겠습니다.

 

 

 

WM_COPYDATA 메세지를 이용하겠습니다. 예제를 위한 코드이니 코드 중복은 이해해주세요^^;

 

메세지를 수신할 Winform에서는 WndProc(윈도우 프로시져) 메서드를 오버라이드합니다.

 

 

 

 

 

 const int WM_COPYDATA = 0x4A;

 

        public struct COPYDATASTRUCT

        {

            public IntPtr dwData;

            public int cbData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;

        }

 

        protected override void WndProc(ref Message m)

        {

            try

            {

                switch (m.Msg)

                {

                    case WM_COPYDATA:

                        COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));

                        MessageBox.Show(cds.lpData);

                        break;

                    default:

                        base.WndProc(ref m);

                        break;

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

 

 

 

 

메세지를 전송할 Winform에서는 SendMessage 함수를 이용해 메세지를 송신합니다.

 

 

 

 

const int WM_COPYDATA = 0x4A;

  

        [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, ref COPYDATASTRUCT lParam);

 

        public struct COPYDATASTRUCT

        {

            public IntPtr dwData;

            public int cbData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;

        }

 

        private void OnButtonSendClick(object sender, EventArgs e)

        {

            string msg = this.tbMsg.Text.Trim();

 

            if (string.IsNullOrEmpty(msg))

            {

                MessageBox.Show("메세지를 입력해주세요");

                return;

            }

 

           Process []pro  =  Process.GetProcessesByName("HowToPostMessage");

           if(pro.Length > 0)

            {

                byte[] buff = System.Text.Encoding.Default.GetBytes(msg);

 

                COPYDATASTRUCT cds = new COPYDATASTRUCT();

                cds.dwData = IntPtr.Zero;

                cds.cbData = buff.Length+1;

                cds.lpData = msg;

 

                SendMessage(pro[0].MainWindowHandle, WM_COPYDATA, 0, ref cds);

            }

        }

 

 

 

 

프로젝트 압축 파일입니다.

 

 

HowToPostMessage.zip

 

왼쪽이 키보드, 오른쪽이 Keys 열거형 이름입니다.

~,` -> Oemtilde
!,1 -> D1
@,2 -> D2
...
),0 -> D0
_,- -> OemMinus
+,= -> OemPlus
|,\ -> OemPipe
← (BackSpace) -> Back
{,[ -> OemOpenBrackets
},] -> OemCloseBrackets
Enter -> Return
Caps Lock -> Capital
:,; -> OemSemicolon
",' -> OemQuotes
Shift -> ShiftKey (오른쪽 왼쪽 다 인식합니다. LShiftKey, RShiftKey도 있습니다.)
< ,, -> Oemcomma
> ,. -> OemPeriod
?,/ -> OemQuestion
Ctrl -> ControlKey (Shift와 마찬가지)
왼쪽 윈도우키 -> LWin
Alt -> Menu (Shift와 마찬가지)
한자 -> HanjaMode
SpaceBar -> Space
한/영 -> KanaMode
오른쪽 윈도우키 -> RWin
마우스 오른쪽 버튼 메뉴 기능의 키(오른쪽 윈도우키 옆에 있는 키) -> Apps
오른쪽 Ctrl -> HanjaMode (Ctrl, RControlKey로도 작동하고, HanjaMode로도 작동합니다.)
PageUp -> PageUp, Prior
PageDown -> PageDown, Next
↑ -> Up
← -> Left
↓ -> Down
→ -> Right

키패드 있는 곳의 키들
/ -> Divide
* -> Multiply
- -> Subtract
+ -> Add
0~9까지 키패드의 숫자들 -> NumPad0 ~ NumPad9
. -> Decimal

 

 

 

참조 : http://sjpison.tistory.com/10

 

 

 

 

 

FileSystemWatcher

작성자 : 김동영

작성일 : 2011. 12. 7

제목 : C# 폴더 감시

 

FileSystemWatcher 클래스는 파일 시스템 변경 알림을 수신하면서 디렉토리 또는

디렉토리의 파일이 변경되면 이벤트를 발생시킵니다.

 

FileSystemWatcher fs = new FileSystemWatcher();//개체 생성

fs.Path = "Test"; //Test 폴더 감시

fs.NotifyFilter = NotifyFilters.FileName|NotifyFilters.DirectoryName; //파일 이름과 폴더 이름 감시

fs.Filter = ""; //특정 파일 감시 ex)*.exe,(모두 감시"", *.*)

fs.Created += new FileSystemEventHandler(fs_Created); //조건에 해당하는 파일 및 폴더의 생성 이벤트 등록

fs.Deleted+=new FileSystemEventHandler(fs_Deleted); //조건에 해당하는 파일 및 폴더의 삭제 이벤트 등록

fs.EnableRaisingEvents = true; //이벤트 활성화

 

testeventhandler += new mydele(Form1_testeventhandler);

 

 

속성

설명

Path

조사할폴더의경로를가져오거나설정

NotifyFilter

조사할변경내용형식을가져오거나설정

Filter

폴더에서 모니터닝할 파일을 결정하는데 사용되는 필터 문자열을 가져오거나 설정

EnableRaisingEvents

구성 요소가 활성화 되는지 여부를 나타내는 값을 가져오거나 설정

 

 

public partial class Form1 : Form

{

delegate void mydele(string path);

event mydele testeventhandler;

 

public Form1()

{

InitializeComponent();

InitWatcher();

}

 

private void InitWatcher()

{

FileSystemWatcher fs = new FileSystemWatcher();

fs.Path = "Test";//

fs.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName;

fs.Filter = "";

fs.Created += new FileSystemEventHandler(fs_Created);

fs.Deleted += new FileSystemEventHandler(fs_Deleted);

fs.EnableRaisingEvents = true;

 

testeventhandler += new mydele(Form1_testeventhandler);

}

 

void fs_Deleted(object sender, FileSystemEventArgs e)

{

MakeMessage(e.FullPath, "삭íe제|");

}

 

void Form1_testeventhandler(string path)

{

listBox1.Items.Add(path);

}

 

 

 

void fs_Created(object sender, FileSystemEventArgs e)

{

MakeMessage(e.FullPath,"생성");

}

 

private void MakeMessage(string FullPath, string msg)

{

string path = string.Format("{0}\\{1}", Application.StartupPath, FullPath);

string extension = Path.GetExtension(path); //확장자 검사 폴더면 Null 반환

if (extension == string.Empty)

{

path = string.Format("{0} 폴더가 {1}되었습니다", path, msg);

}

else

{

path = string.Format("{0} 파일이 {1}되었습니다", path, msg);

}

listBox1.Invoke(testeventhandler, new object[] { path });

}

}

 

    

결과:

 

 

 

 

자세한 내용: MSDN 링크

+ Recent posts