2016년 8월 23일 화요일

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][C#,ADO.NET예제]개선된 주소록, C#윈폼,ADO.NET, 계산기소스

[C#,ADO.NET예제]개선된 주소록, C#윈폼,ADO.NET, 계산기소스

- TreeView, MenuStrip 사용하여 메뉴구성
- ListView를 이용하여 Adapter를 사용하지 않고 데이터 출력,수정,삭제,입력
- DataGridView를 사용한 CRUD 구현
- OleDbDataAdapter를 이용한 CRUD 구현 및 Transaction 처리
- Timer, Deligate를 이용한 DataGridView 자동갱신 구현
- MessageFilter를 이용한 ALT+F4 키 막기
- 계산기 기능
- File 로깅
- OpenFileDialog를 이용한 로그파일 보기

감사합니다.

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀]윈도우 메시지박스(MessageBox)실습

윈도우 메시지박스(MessageBox)실습

using System;
using System.Windows.Forms;

namespace Ojc
{
    class MessageBoxTest
    {
        static void Main(string[] args)
        {
            // 가장 단순한 메시지 박스            
            MessageBox.Show("메시지");

            // 메시지 텍스트와 타이틀을 가지는 메시지 박스
            MessageBox.Show("메시지", "타이틀");


            // 두개의 버튼(yes, no)를 가지는 메시지 박스
            DialogResult result1 = MessageBox.Show("메시지", "타이틀(두 버튼 메시지박스)",
                                                    MessageBoxButtons.YesNo);
            if (result1 == DialogResult.Yes) Console.WriteLine("YES 클릭");
            else Console.WriteLine("NO 클릭");
            Console.WriteLine("1. -------------");

            // YesNoCancel 버튼, Question icon을 가지는 메시지 박스
            DialogResult result2 = MessageBox.Show("메시지", 
                                            "타이틀(Question 메시지박스,YesNoCancel)",
                                            MessageBoxButtons.YesNoCancel,
                                            MessageBoxIcon.Question);

            if (result2 == DialogResult.Yes) Console.WriteLine("YES 클릭");
            else if (result2 == DialogResult.No) Console.WriteLine("NO 클릭");
            else if (result2 == DialogResult.Cancel) Console.WriteLine("CANCEL 클릭");
            Console.WriteLine("2. -------------");

            // YesNoCancel 버튼, Question icon, Default 버튼을 가지는 메시지박스
            // 두번째 버튼인 NO버튼을 기본으로 포커스가 설정됨
            DialogResult result3 = MessageBox.Show("메시지", 
                                            "타이틀(Question,YesNoCancel,Default버튼)",
                                                MessageBoxButtons.YesNoCancel,
                                                MessageBoxIcon.Question,  //?로 표시
                                                MessageBoxDefaultButton.Button2);
                       
            // 타이틀, 메시지가 우측 정렬되어 표시되는 메시지 박스
            // 아래 true는 도움말 버튼 표시여부
            MessageBox.Show("메시지",
                            "타이틀(메시지 우측 정렬,Error아이콘)",
                            MessageBoxButtons.OKCancel,
                            MessageBoxIcon.Error,  //X로표시
                            MessageBoxDefaultButton.Button1,
                            MessageBoxOptions.RightAlign,
                            true);  

            // exclamation icon을 가지는 메시지 박스
            MessageBox.Show("메시지",
                            "타이틀(exclamation icon)",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Exclamation);  //!로 표시
        }
    }
}

[결과]

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][C#링크예제]메소드쿼리식에서 Aggregate사용간단예제

[C#링크예제]메소드쿼리식에서 Aggregate사용간단예제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinqAggregationExam
{
    class Program
    {
        static void Main(string[] args)
        {
            //Aggregate는 값을 포워드 하면서 주어진 연산을 수행한다.
            var numbers = new int[] { 1, 2, 3, 4, 5 };

            // 1*2 한 후 결과를 3과 곱하고, 다시 결과를 4와 곱함...
            var result = numbers.Aggregate((a, b) => a * b);
            Console.WriteLine(result);

            // 10은 SEED, 10+1 결과를 2와 더하고 다시 결과를 3과 더함...
            result = numbers.Aggregate(10, (a, b) => a + b);
            Console.WriteLine(result);
        }
    }
}

[결과]
120
25

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][예제]델리게이트,람다식문자열정렬,뒤짚기,대문자변경

[예제]델리게이트,람다식문자열정렬,뒤짚기,대문자변경

소문자로 문자열을 입력받아 
    - 첫글자만 대문자로 변환 
    - 마지막 글자만 대문자로 변환 
    - 전체문자열을 대문자로 변환 
    - 문자열을 뒤짚기 
    - 문자열 내의 각 문자를 알파벳 순으로 오름차순 정렬 

델리게이트, 람다식를 이용하여 구현예제.

참고하세요

using System;
using System.Linq;

class Program
{
    delegate string MyStringDelidate(string s);

    static string UppercaseFirst(string s)
    {
        char[] buf = s.ToCharArray();
        buf[0] = char.ToUpper(buf[0]);
        return new string(buf);
    }

    static string UppercaseLast(string s)
    {
        char[] buf = s.ToCharArray();
        buf[buf.Length - 1] = char.ToUpper(buf[buf.Length - 1]);
        return new string(buf);
    }

    static string UppercaseAll(string s)
    {
        return s.ToUpper();
    }

    static string ReverseAll(string s)
    {
        char[] buffer = s.ToCharArray();
        return new String(buffer.Reverse().ToArray());
    }

    static string MySort(string s)
    {
        char[] buf = s.ToCharArray();
        Array.Sort<char>(buf);
        return new String(buf);
    }

    static void Output(string s, MyStringDelidate deli)
    {
        Console.Write("Before: {0}", s);
        Console.WriteLine(", After: {0}", deli(s));
    }

    static void Main()
    {
        Console.WriteLine("영문자 소문자로 입력하세요...");
        string str = Console.ReadLine();
        Console.WriteLine();

        Output(str, new MyStringDelidate(UppercaseFirst));
        Output(str, new MyStringDelidate(UppercaseLast));
        Output(str, new MyStringDelidate(UppercaseAll));
        Output(str, new MyStringDelidate(ReverseAll));
        Output(str, new MyStringDelidate(MySort));
    }
}


[결과]
영문자 소문자로 입력하세요...
hello

Before: hello, After: Hello
Before: hello, After: hellO
Before: hello, After: HELLO
Before: hello, After: olleh
Before: hello, After: ehllo


===============================================================


using System;
using System.Linq;

class Program
{
    delegate string MyStringDelidate(string s);

    static void Output(string s, MyStringDelidate deli)
    {
        Console.Write("Before: {0}", s);
        Console.WriteLine(", After: {0}", deli(s));
    }
    
    static void Main()
    {
        Console.WriteLine("영문자 소문자로 입력하세요...");
        string str = Console.ReadLine();
        Console.WriteLine();

        Output(str, s =>
                    {
                        char[] buf = s.ToCharArray();
                        buf[0] = char.ToUpper(buf[0]);
                        return new string(buf);
                    });

        Output(str, s => 
                    {
                        char[] buf = s.ToCharArray();
                        buf[buf.Length - 1] = char.ToUpper(buf[buf.Length - 1]);
                        return new string(buf);
                    });

        Output(str, s =>
                    {
                        return s.ToUpper();
                    });

        Output(str, s =>
                    {
                        char[] buffer = s.ToCharArray();
                        return new String(buffer.Reverse().ToArray());
                    });

        Output(str, s => 
                    {
                        char[] buf = s.ToCharArray();
                        Array.Sort<char>(buf);
                        return new String(buf);
                    });
    }
}


[결과]
영문자 소문자로 입력하세요...
korea

Before: korea, After: Korea
Before: korea, After: koreA
Before: korea, After: KOREA
Before: korea, After: aerok
Before: korea, After: aekor

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][델리게이트간단예제]람다식, 델리게이트 invoke

[델리게이트간단예제]람다식, 델리게이트 invoke

using System;

class Program
{
    delegate void Deli(string s);

    static void Main()
    {
        // Specify delegate with lambda expression.
        Deli d = (v) => Console.WriteLine(v);
        //Invoke delegate.
        d.Invoke("OJC");

        // Specify delegate with new Constructor
        Deli d1 = new Deli(d);
        //Invoke delegate.
        d1.Invoke("OJC");

        // Specify delegate with method name
        Deli d2 = d;
        //Invoke delegate.
        d2.Invoke("OJC");
    }

    static void d(string s)
    {
        Console.WriteLine(s);
    }
}



[결과]
OJC
OJC
OJC

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][C#델리게이트 간단 예제]

[C#델리게이트 간단 예제]

using System;

// 델리게이트 작성 방법
// 1. 선언
// 2. 생성
// 3. 호출
//
// 델리게이트는 메소드를 참조하고 있는 것으로
// 런타임시 델리게이트가 참조하는 메소드를 실행하고
// 구현을 동적으로 할 수 있는 콜백 함수를 구현하는 용도

class Program
{
    public delegate int MyDelegate(int i, int j);
    public static void Main()
    {
        //TakesADelegate 메소드를 부르면서 인자로 델리게이트를 
        //생성하고 델리게이트의 인자로는 첨조할 메소드명을 넣어준다.
        TakesADelegate(new MyDelegate(Add));     
        TakesADelegate(new MyDelegate(Minus));
        TakesADelegate(new MyDelegate(Gop));
        TakesADelegate(new MyDelegate(Nanugi));
    }
    public static void TakesADelegate(MyDelegate SomeFunction)
    {
        //컴파일 시점에 할일이 지정되지 않고 런타임중에 
        //메소드 인자로 대입되는 델리게이트에 의해 할 일이 결정된다.
        Console.WriteLine(SomeFunction(1,2));  
    }

    public static int Add(int i, int j)
    {
        return i + j;
    }
    public static int Minus(int i, int j)
    {
        return i - j;
    }
    public static int Gop(int i, int j)
    {
        return i * j;
    }
    public static int Nanugi(int i, int j)
    {
        return i / j;
    }
}

[결과]
3
-1
2
0

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][C#쓰레드예제]ThreadStart, ParameterizedThreadStart 예제

[C#쓰레드예제]ThreadStart, ParameterizedThreadStart 예제

1부터 100까지의 합을 10개의 쓰레드에 나누어서 실행하고자 한다. 
첫번째 쓰레드는 1~10 까지의 합을, 두번째 쓰레드는 11~20 까지의 합을.... 아홉번째 쓰레드는 
91~100 사이의 합을 구하는데 아래 두 방법으로 프로그램을 작성하세요. 

- ParameterizedThreadStart 델리게이트를 이용하여 작성하세요. 
- ThreadStart 델리게이트를 이용하여 작성하세요 

ParameterizedThreadStart 델리게이트는 모양은 아래와 같다.

public delegate void ParameterizedThreadStart(object obj);

하나의 파라미터를 object 형식으로 전달하기 때문에 여러 개의 파라미터를 전달하기 위해서는 클래스나 구조체를 만들어 객체를 생성해서 전달할 수 있다. 
파라미터의 전달은 Thread.Start() 메서드를 호출할 때 파라미터를 전달한다. 

참고로 ThreadStart를 이용해 파라미터를 전달하는 방법은 일단 델리게이트 메서드는 파라미터를 받아들이지 않으므로 그 메서드 안에서 다른 메서드를 호출하면서 파라미터를 전달하는 방식을 사용할 수 있다.

1. ParameterizedThreadStart 델리게이트를 이용하여 작성

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication2
{
    class Program
    {
        static int mysum = 0;
        static void DoSomething(object n)
        {
            int sum = 0;
            int[] number = (int[])n;
            for (int i = number[0]; i <= number[1]; i++)
            {
                sum += i;
            }
            mysum += sum;
        }
        static void Main(string[] args)
        {
            Thread t1 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t2 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t3 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t4 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t5 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t6 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t7 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t8 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t9 = new Thread(new ParameterizedThreadStart(DoSomething));
            Thread t10 = new Thread(new ParameterizedThreadStart(DoSomething));

            t1.Start(new int[] { 1, 10 });            
            t2.Start(new int[] { 11, 20 });
            t3.Start(new int[] { 21, 30 });
            t4.Start(new int[] { 31, 40 });
            t5.Start(new int[] { 41, 50 });
            t6.Start(new int[] { 51, 60 });
            t7.Start(new int[] { 61, 70 });
            t8.Start(new int[] { 71, 80 });
            t9.Start(new int[] { 81, 90 });
            t10.Start(new int[] { 91, 100 });
            t1.Join();
            t2.Join();
            t3.Join();
            t4.Join();
            t5.Join();
            t6.Join();
            t7.Join();
            t8.Join();
            t9.Join();
            t10.Join();

            Console.Write("1부터50까지의 합은{0}::", mysum);
        }
    }
}


2. ThreadStart 델리게이트를 이용하여 작성

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication3
{
    class Program
    {
        static int mysum = 0;
        static void Sum(object n)
        {
            int sum = 0;
            int[] number = (int[])n;
            for (int i = number[0]; i <= number[1]; i++)
            {
                sum += i;
            }
            mysum += sum;
        }

        static void Main(string[] args)
        {            
            Thread t1 = new Thread(new ThreadStart(() => Sum(new int[] { 1, 10 })));
            Thread t2 = new Thread(new ThreadStart(() => Sum(new int[] { 11, 20 })));
            Thread t3 = new Thread(new ThreadStart(() => Sum(new int[] { 21, 30 })));
            Thread t4 = new Thread(new ThreadStart(() => Sum(new int[] { 31, 40 })));
            Thread t5 = new Thread(new ThreadStart(() => Sum(new int[] { 41, 50 })));
            Thread t6 = new Thread(new ThreadStart(() => Sum(new int[] { 51, 60 })));
            Thread t7 = new Thread(new ThreadStart(() => Sum(new int[] { 61, 70 })));
            Thread t8 = new Thread(new ThreadStart(() => Sum(new int[] { 71, 80 })));
            Thread t9 = new Thread(new ThreadStart(() => Sum(new int[] { 81, 90 })));
            Thread t10 = new Thread(new ThreadStart(() => Sum(new int[] { 91, 100 })));

            t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start();
            t6.Start(); t7.Start(); t8.Start(); t9.Start(); t10.Start();

            t1.Join(); t2.Join(); t3.Join(); t4.Join(); t5.Join();
            t6.Join(); t7.Join(); t8.Join(); t9.Join(); t10.Join();

            Console.WriteLine(mysum);

        }
    }
}

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][C#강좌]ALT+F4(윈도우종료)키 막기,메시지필터링,IMessageFilter,Application.AddMessageFilter

[C#강좌]ALT+F4(윈도우종료)키 막기,메시지필터링,IMessageFilter,Application.AddMessageFilter

Application 클래스의 AddMessageFilter() 메소드는 응용프로그램에 메시지 필터를 등록하며 이 메소드의 매개변수로 IMessageFilter를 구현한 클래스의 인스턴스를 매개변수로 받으며 IMessageFilter의 PreFilterMessage를 구현해야 한다.

[예제]

using System.Windows.Forms;
using System;
namespace ConsoleApplication1
{   
    public class Program : Form
    {
        static void Main()
        {
            Application.AddMessageFilter(new AltF4Filter()); // Add a message filter
            Application.Run(new Program());
        }
    }

    public class AltF4Filter : IMessageFilter
    {
        public bool PreFilterMessage(ref Message m)
        {
            const int WM_SYSKEYDOWN = 0x0104;
            if (m.Msg == WM_SYSKEYDOWN)
            {
                bool alt = ((int)m.LParam & 0x20000000) != 0;
                if (alt && (m.WParam == new IntPtr((int)Keys.F4)))
                    Console.WriteLine("ALT+F4 Filtering됨.");
                    return true; // eat it!                
            }
            return false;
        }
    }
}

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][C#예제]델리게이트 체인/멀티캐스팅예제,닷넷Delegate,Delegate.Combine

[C#예제]델리게이트 체인/멀티캐스팅예제,닷넷Delegate,Delegate.Combine

델리게이트 체인은 하나의 델리게이트에 여러 델리게이트를 체인처럼 연결해서 한번에 실행할 수 있는 방법을 제공한다.

Delegate.Combine으로 여러 델리게이트를 연결하는데 이는 델리게이트 멀티캐스팅 형태로 변환 가능하다. 아래 예제를 참조하자.

using System;
namespace ConsoleApplication6
{
    delegate void OnjDelegate(int a, int b);
    class MainApp
    {
        static void Plus(int a, int b) { Console.WriteLine("{0} + {1} = {2}", a, b, b); }
        static void Minus(int a, int b) { Console.WriteLine("{0} - {1} = {2}", a, b, a - b); }
        void Multiplication(int a, int b) { Console.WriteLine("{0} * {1} = {2}", a, b, a * b); }
        void Division(int a, int b) { Console.WriteLine("{0} / {1} = {2}", a, b, a / b); }
        static void Main()
        {
            MainApp m = new MainApp();
            OnjDelegate CallBack = (OnjDelegate)Delegate.Combine(
            new OnjDelegate(MainApp.Plus),
            new OnjDelegate(MainApp.Minus),
            new OnjDelegate(m.Multiplication),
            new OnjDelegate(m.Division));
            CallBack(4, 3);
            Console.WriteLine("-----------------");

            OnjDelegate CallBack2 = new OnjDelegate(MainApp.Plus);
            CallBack2 += new OnjDelegate(MainApp.Minus);
            CallBack2 += new OnjDelegate(m.Multiplication);
            CallBack2 += new OnjDelegate(m.Division);
            CallBack2(4, 3);
            Console.WriteLine("-----------------");

            OnjDelegate CallBack3_1 = new OnjDelegate(MainApp.Plus);
            OnjDelegate CallBack3_2 = new OnjDelegate(MainApp.Minus);
            OnjDelegate CallBack3_3 = new OnjDelegate(m.Multiplication);
            OnjDelegate CallBack3_4 = new OnjDelegate(m.Division);
            OnjDelegate CallBack3 = CallBack3_1 + CallBack3_2 + CallBack3_3 + CallBack3_4;
            CallBack3(4, 3);
        }

    }
}


[결과]
4 + 3 = 3
4 - 3 = 1
4 * 3 = 12
4 / 3 = 1
-----------------
4 + 3 = 3
4 - 3 = 1
4 * 3 = 12
4 / 3 = 1
-----------------
4 + 3 = 3
4 - 3 = 1
4 * 3 = 12
4 / 3 = 1

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][C#배열의 최대값 및 버블정렬을 이용하여 정렬예제]

[C#배열의 최대값 및 버블정렬을 이용하여 정렬예제]

버블정렬(Bubble sort)은 두 인접한 원소를 검사하여 정렬하는 방법이다. 시간 복잡도가 O(n^2)로 상당히 느리지만, 코드가 단순하기 때문에 자주 사용된다.




using System;
using System.Linq;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("배열요소를 콤마를 기준으로 입력하세요. 예) 1,10,7,6,5");
            string str = Console.ReadLine();
            string[] sArray = str.Split(',');

            Console.WriteLine("<<<<< 입력받은 배열 출력...>>>>>");
            foreach (string s in sArray)
            {
                Console.Write(s + " ");
            }
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("<<<<< 최대값은...>>>>>");
            int[] iArray = Array.ConvertAll(sArray, s => int.Parse(s));
            int max = iArray.Max();
            Console.WriteLine("MAX VALUE : " + max);
            Console.WriteLine();

            //버블정렬
            for (int i = 1; i < iArray.Length; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    if (iArray[j] > iArray[i])
                    {
                        int tmp = iArray[i];
                        iArray[i] = iArray[j];
                        iArray[j] = tmp;
                    }
                }
            }
            Console.WriteLine("<<<<< 버블정렬 후 배열 출력...>>>>>");
            foreach (int  i in iArray)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();
        }
    }
}


[결과]
배열요소를 콤마를 기준으로 입력하세요. 예) 1,10,7,6,5
1,10,7,6,5
<<<<< 입력받은 배열 출력...>>>>>
1 10 7 6 5

<<<<< 최대값은...>>>>>
MAX VALUE : 10

<<<<< 버블정렬 후 배열 출력...>>>>>
1 5 6 7 10