문제점

 아래처럼 소켓의 Connect 메소드를 사용할 경우 서버가 접속불가능한 상태에서는 Timeout 시간이 너무 길다. 

m_clientSocket.Connect(ipEnd);


해결방법

public static class SocketExtensions
{
    /// <summary>
    /// Connects the specified socket.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="endpoint">The IP endpoint.</param>
    /// <param name="timeout">The timeout.</param>
    public static void Connect(this Socket socket, EndPoint endpoint, TimeSpan timeout)
    {
        var result = socket.BeginConnect(endpoint, null, null);

        bool success = result.AsyncWaitHandle.WaitOne(timeout, true);
        if (success)
        {
            socket.EndConnect(result);
        }
        else
        {
            socket.Close();
            throw new SocketException(10060); // Connection timed out.
        }
    }
}


참조

http://stackoverflow.com/questions/1062035/how-to-configure-socket-connect-timeout



Worker workerObject = new Worker(); Thread workerThread = new Thread(workerObject.DoWork); // Start the worker thread. workerThread.Start();

...

...

workerThread.Start(); <--- 오류 발생


오류 내용

 스레드가 실행 중이거나 종료되었습니다. 다시 시작할 수 없습니다. 


해결

 Thread는 한번 사용되면 재사용될 수 없다. 따라서 Thread 객체를 새로 생성해서 사용해야 된다.

Windows7 64bit에서는 MS Access(*.mdb)파일을 open할 수가 없다.
32비트 ODBC 드라이버를 사용하기 때문인데, 이를 해결하기 위해서는 64비트용 ODBC 드라이버를 설치해야 한다.

Microsoft Access Database Engine 2010 재배포 가능 패키지


ADO DB 연결 문자열
32비트
"Driver={Microsoft Access Driver (*.mdb)}; .. "

64비트
"Driver={Microsoft Access Driver (*.mdb, *.accdb)}; .. "

 메타데이터는 관리되는 모듈에 정의되어 있는 것들(클래스와 클래스 맴버, 구조체등)의 목록과 기초적인 정보를 저장해 놓은 일종의 데이터 테이블이라고 생각하면 된다. 따라서 이 테이블만 확인하면 해당 모듈에서 어느 타입들이 정의되어 있는지 쉽게 확인 가능하다. 또한 메타데이터는 모듈에서 정의한 타입들 외에도 모듈에 참조되어서 사용된 타입들의 리스트 역시 저장하고 있다. 메타데이터는 기존의 Type Library와 IDL(Interface Definition Language)파일과 같은 기술들의 진보된 형태라고 할 수 있으며 이전 기술보다 완성도나 활용도가 훨씬 높다. 또한 기존 Type Library와 IDL파일과는 달리 메타데이터는 항상 소스가 컴파일된 형태인 IL과 동일한 파일에 있게 된다. 닷넷의 실행 파일(exe, dll) 혹은 닷넷 어셈블리라고 불리는 것에는 항상 IL코드와 메타데이터가 같이 존재한다(언어 컴파일러가 어셈블리를 생성할 때 IL과 메타데이터를 항상 같이 생성하기 때문에 메타데이터를 IL로 부터 따로 분리하는 것은 불가능하다). 따라서 IL코드와 이를 설명해주는 메타데이터는 서로 버전이 다를 수 없으며 항상 같은 버전으로 동기화 되어있다.

메타데이터의 주요 사용 용도
 컴파일러가 컴파일 수행시 기존의 해더 혹은 라이브러리 파일 같은 것이 없어도 컴파일 가능하게 해준다. 이미 정의된 모든 타입과 참조된 타입의 정보가 실행 파일에 자세하게 기록되어 있으므로 컴파일러는 이러한 정보를 관리되는 모듈에서 정확하게 읽을 수 있다.
 Visual Studio와 같은 개발 툴에서 메타데이터는 개발 생산성을 높이는데 이용될 수 있다. 개발자가 코드를 작성할 때 메타데이터 정보를 읽고서 메서드, 속성, 이벤트, 멤버등의 정보를 미리 보여줄 수 있다. 그 대표적인 예가 Visual Studio의 인텔리전스기능이다.
 CLR의 코드 검증 기능은 메타데이터의 정보를 통해 해당 실행 파일이 안전하게 실행될 수 있는지 확인할 수 있다.
 메타데이터는 객체의 상태를 보존할 수 있도록 Serialize혹은 Deserialize를 가능하게 해준다. 객체의 상태를 메모리 블록에 serialize한 후 원격 PC에 전송하고 다시 deserialize하여 결과적으로 객체의 상태를 원격 PC에 전송 가능하게 할 수 있는 것도 메타데이터가 있기 때문에 가능한 것이다.
 메타데이터는 가비지 수집기가 객체의 수명 상태를 조사하여 수집 대상을 확인하는데 도움을 준다. 예를 들어 가비지 수집기는 런타임 시 객체의 타입을 메타데이터를 통해서 정확하게 알 수 있다. 또한 이를 통해서 해당 객체가 포함하고 있는 맴버들의 리스트를 확인할 수 있고, 이들 중 어느 멤버가 다른 객체에 의해서 참조되고 있는지도 확인이 가능하다.
Program.cs파일의 Main()메소드의 제일 첫 부분에 입력하면 된다.

int thisID = System.Diagnostics.Process.GetCurrentProcess().Id; // 현재 기동한 프로그램 id
//실행중인 프로그램중 현재 기동한 프로그램과 같은 프로그램들 수집
System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("프로세스명");
if (p.Length > 1)
{
    for (int i = 0; i < p.Length; i++)
    {
            if (p[i].Id == thisID)
            {
                MessageBox.Show(
                            "동시에 같은 프로그램을 구동시킬 수 없습니다.",
                            "확인",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Warning,
                            MessageBoxDefaultButton.Button1);
                        p[i].Kill();
                        break;
            }
    }
}
C#에서 현재 경로를 알아내는 방법은 여러가지가 있다.

1. System.Environment.CurrentDirectory

가장 쉽게 현재 실행 경로를 알아낼 수 있는 방법이다. 하지만 이 방법은 Register에 등록된 프로그램으로 실행되면 다른 값을 출력한다. 이때는 3번 Application.StartupPath를 이용해야 한다.

* 루트일 경우에는 '\' 반환, 그 외의 경우에는 폴더명까지만 반환한다.
  • C:\
  • C:\TestFolder\MyApp

2. System.IO.Directory.GetCurrentDirectory()


1번과 동일하다.


3. Application.StartupPath

위 의 Register에 등록되었을 때도 정상적으로 자신의 시작 경로를 반환한다. 하지만 이는 Window Forms를 사용할 때만 Application 클래스를 사용할 수 있기 때문에 Console 기반 혹은, 클래스 라이브러리 기반에서는 사용이 불가능하다.
Tip. Application.ExecutablePath
현재 실행된 어플리케이션의 실행 파일의 위치이다. C:\Test\App.exe 와 같이 출력된다. 이 정보는 현재 경로가 아니기 때문에 변경되지 않는다.

'닷넷 프레임워크' 카테고리의 다른 글

메타데이터  (0) 2010.12.13
프로그램 중복 실행 금지  (0) 2010.11.22
byte[] to char[]  (0) 2010.08.31
Compact Framework 환경에서 코드 시간 측정하기  (0) 2010.07.01
enum 데이터 타입에 null 할당하기  (0) 2010.06.24
통신 프로토콜에서 데이터를 아스키 값으로 사용할때 필요할 경우가 있다.
byte[] byteDataArr = new byte[] { 0x41, 0x42, 0x43 };
char[] charDataArr = System.Text.Encoding.ASCII.GetString(byteDataArr).ToCharArray();
            int start = System.Environment.TickCount;
System.Threading.Thread.Sleep(666);
int end = System.Environment.TickCount;
Console.WriteLine("측정 시간 : {0}ms", end - start);
Console.ReadLine();


실행 결과
측정 시간 : 667ms

거의 1~2ms 정도의 오차로 측정되고 있다.
닷넷프레임워크 2.0이상에서는 Stopwatch 클래스를 이용하면 손쉽게 시간을 측정할 수 있지만
이 방법도 여러모로 쓸모가 많은 것 같다.

StopWatch 사용법
http://kworks.tistory.com/99

프로그램을 하다 보면 enum이나 sturct 데이터형에 null을 넣어서 초기화를 하고 싶을 때가 있다.
이 방법을 알기전까진 -9999이나 0처럼 쓰이지 않는 값을 NONE에 넣어서 초기화를 했는데, 그럴 필요가 없다.
모르면 손발이 고생.

C#에서 Value형태의 데이터형에 null 데이터를 넣을 수 있는 방법을 제공한다.
이 방법은  .net framework 2.0이상에서만 사용할 수 있다.

        enum Color
        {
            RED = 0x39,
            GREEN,
            BLUE,
        }

        Nullable<Color> whatColor = new Color();
        //whatColor = Color.GREEN;
        whatColor = null;

        if (whatColor != null)
        {
                Console.WriteLine(whatColor);
                Console.WriteLine(Enum.Format(typeof(Color), whatColor, "g"));
                Console.WriteLine(Enum.Format(typeof(Color), whatColor, "G"));
        }
        else
        {
                Console.WriteLine("whatColor variable is null.");
        }



     enum Color
        {
            RED = 0x39,
            GREEN,
            BLUE,
        }

----------------------------------------------------------------------------------------------

        Color whatColor = Color.GREEN;

        Console.WriteLine(whatColor);
        Console.WriteLine(Enum.Format(typeof(Color), whatColor, "g"));
        Console.WriteLine(Enum.Format(typeof(Color), whatColor, "G"));

        Console.WriteLine(Enum.Format(typeof(Color), whatColor, "d"));
        Console.WriteLine(Enum.Format(typeof(Color), whatColor, "D"));

        Console.WriteLine(Enum.Format(typeof(Color), whatColor, "x"));
        Console.WriteLine(Enum.Format(typeof(Color), whatColor, "X"));

        Console.WriteLine(Enum.Format(typeof(Color), whatColor, "f"));
        Console.WriteLine(Enum.Format(typeof(Color), whatColor, "F"));

결과
GREEN
GREEN
GREEN
58
58
0000003A
0000003A
GREEN
GREEN

계속하려면 아무 키나 누르십시오 . . .



가끔 enum 데이터 타입의 값을 문자열로 출력할 일이 있는데 이 방법을 이용하면 쉽게 해결된다.


참고 :
  http://msdn.microsoft.com/ko-kr/library/system.enum.format%28VS.90%29.aspx
  http://msdn.microsoft.com/ko-kr/library/system.enum.getname%28VS.90%29.aspx
로드가 많은 환경에서 메모리 부족 예외가 발생할 수 있다.
이는 .NET 가비지 컬렉터(GC)가 항상 메모리를 dispose하지 않기 때문에 발생할 수 있다.

이 문제를 해결하기 위해서 빈번하게 GC.WaitForPendingFinalizers 메서드를 직접 호출해야 한다.

참고 GC.WaitForPendingFinalizers 메서드를 직접 호출하는 응용 프로그램은 성능이 저하될 수 있다.


출저 : http://support.microsoft.com/kb/912884

CF(Compact Framework)환경에서는 Applicaion.StartUp을 지원하지 않는다.
따라서 아래의 방법을 사용한다.

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

 .NET Framework 2.0 이상에서는 손쉽게 Stopwatch 클래스를 사용하면 되겠지만 CF(Compact Framework) 환경에서는 이 를 사용할 수 없다. 이를 해결하기 위해서는 System.Environment.TickCount을 사용해야 한다.

int start = System.Environment.TickCount;
for (int i = 0; i < 10; i++) System.Threading.Thread.Sleep(10); // 100ms 대기
int end = System.Environment.TickCount;
int duration = end - start;
Console.WriteLine("{0}ms", duration);

Stopwatch 클래스를 이용해서 실행시간을 구하는 방법
http://ocplay.tistory.com/99

작업 중에 데이터 복사하는 루틴을 수정하고 있었는데, 문득 for문을 돌려서 무식하게 데이터를 집어넣는 방법과 시샵에서 C언어의memset함수 격인 Array.Copy 메소드를 사용하는 방법 중 어는 쪽이 더 빠를까 궁금증이 생겼다. 그래서 바로 테스트 해본 결과 놀랍게도 무식하게 for문돌려서 데이터를 복사한 방법이 더 빨랐다.

테스트 코드
int[] src = new int[40000000];
int[] dst = new int[40000000];

for (int i = 0; i < src.Length; i++)
{
src[i] = 0xff;
}

Stopwatch sw = new Stopwatch();

// -------------------------------------------------------
 sw.Start();
for (int i = 0; i < dst.Length; i++)
{
                dst[i] = src[i];
}
sw.Stop();
Console.WriteLine("{0}ms", sw.ElapsedMilliseconds);
 // -------------------------------------------------------

sw.Start();
Array.Copy(src, dst, dst.Length);
sw.Stop();
Console.WriteLine("{0}ms", sw.ElapsedMilliseconds);


결과
for문 복사 : 262ms
Array.Copy 메소드를 이용한 복사 : 348ms

흥미로운 결과가 한가지 더 있다.
CPU 점유율을 체크해본 결과 for문으로 돌렸을 때 CPU점유율이 Array.Copy 메소드를 썼을 때 보다 약 10프로 정도 더 먹는 것을 볼 수 있있다. 뭐 Array.Copy 메소드 내부가 어떻게 구현되어있는지는 확인해봐야 알겠지만 for문 돌리는게 CPU 점유율이 더 먹는건 당연한 것 같다. 시간날 때 왜 이런가 이유를 밝혀내봐야 겠다 ㅋㅋ


.NET 프로그래밍을 하는 데에 있어 한가지 장점을 꼽으라면 전에 비해 상당히 쉬워진 멀티쓰레드 프로그래밍이라고 있다. 하지만 많은 개발자들이 놓치는 부분이 쓰레드에서 UI 접근하는 부분이다.

 

우선 윈도우즈 프로그래밍에서 UI부분이 어떻게 동작하는지 이해할 필요가 있다. 윈도우에서 UI 메시지 펌프 (Message Pump)라고 불리는 방법에 의해서 화면에 그려진다. 선하나를 화면에 그린다고 가정하면, 윈도우즈는 선을 계속해서 반복적으로 그림으로써 사용자에게 마치 선이 하나가 있는 것처럼 보이게 하는 것이다. 그리고 이를 위해 많은 메시지, 인스트럭션이 보내진다.

 

예를 들어 폼의 이벤트를 살펴보면 OnPaint라는 이벤트를 발견할 있다. 이벤트내에 int I = 0; 이라는 코드를 삽입하고 브레이크 포인트를 걸어 실행을 시켜보면 윈도우는 보이지 않고 브레이크 포인트가 계속 해서 걸리는 것을 있다. 사용자가 모르는 사이 .NET 프레임웍은 윈도우즈에 해당 UI 화면에 그리도록 명령을 끊임 없이 보내며 이벤트를 발생시키는 것이다.

 

여기서 한가지 중요한 부분이 있다. .NET 프레임웍은 윈도우즈에 메시지를 보내는 과정에서 이벤트를 발생 시킴으로써 개발자에게 자신의 코드를 삽입할 기회를 부여한다는 것이다. 모든 부분이 UI 접근하려는 쓰레드와 관련이 있다.

 

모든 프로그램은 기본적으로 하나의 쓰레드로 시작이 된다. 따라서 폼을 화면에 그리는 메시지와 이벤트들도 쓰레드 안에서 구동이 된다. 하지만 사용자가 시작한 쓰레드는 쓰레드와는 별개로 실행이 된다. 따라서 커스텀 쓰레드에서 UI 직접 접근을 하면 적절한 마샬링 없이 다른 쓰레드를 침범하는 것이다 (Cross Thread). 다시 말해, UI 쓰레드가 열심히 화면에 폼을 그리고 있는데 갑자기 다른 쓰레드가 와서 짓을 하고 가는 꼴이 되버리는 것이다.

 

이를 위해서 UI 컨트롤들은 Invoke, BeginInvoke 메서드와 InvokeRequired 속성을 지원한다. Invoke 메서드는 동기 (Synchronous) 메서드이고 BeginInvoke 비동기 (Asynchronous) 메서드이다. 메서드들은 컨트롤들이 생성된 쓰레드의 메시지 펌프에 커스텀 코드를 삽입하여 쓰레드에서 컨트롤를 업데이트할 있도록 한다. Win32에서 SendMessage PostMessage 생각하면 된다. InvokeRequired 속성은 Boolean 값을 반환하며 Invoke InvokeRequired 메서드를 호출해야 하는지를 알려준다.

 

Invoke BeginInvoke 메서드는 인자로서 delegate 형태를 받는다. 다음은 Invoke 메서드를 호출하는 방법중 하나이다.

 

this.Invoke(new MethodInvoker(UpdateMe));

void UpdateMe()

{

}

 

MethodInvoker 프레임웍에서 지원하는 delegate 클래스로 인자가 없는 메서드들을 호출 있도록 정의가 되어있다. 만약 인자를 넘겨줄 필요가 있다면 delegate 따로 정의하여 사용하면 된다. 다음은 인자를 갖는 메서드를 호출할 때의 예이다.

 

Delegate void UpdateMeDelegate(string message);

this.Invoke(new UpdateMeDelegate(UpdateMe), “This is the message”);

toid UpdateMe(string message)

{

}

 

Invoke 메서드는 동기 메서드이기 때문에 바로 실행되어 시간이 걸리는 작업에는 적합하지 않다. 이런 경우는 비동기 메서드인 BeginInvoke 사용하면 된다. BeginInvoke 메서드는 EndInvoke 메서드와 짝으로 구동이 된다. EndInvoke 비동기로 실행된 작업을 완료하는 역할을 한다.

 

IAsyncResult ar = this.BeginInvoke(new MethodInvoker(UpdateMe));

 

 

this.EndInvoke(ar);

 

BeginInvoke 메서드에서 실행된 작업이 끝나면 EndInvoke 메서드를 호출하여 작업을 완료한다.


출저 : http://www.jongkok4.net/137

'닷넷 프레임워크' 카테고리의 다른 글

.NET Compact framework에서 실행시간 구하는 방법  (0) 2010.02.08
데이터 배열 복사 성능 비교  (1) 2010.01.30
Hex 문자열을 실제 Hex값으로 변경  (0) 2009.12.30
memset in c#  (0) 2009.12.20
UDP 통신  (0) 2009.11.26

string hexString = "FF";
int hex = Convert.ToInt32(hexString, 16);
Console.WriteLine("{0} {1} {2:x2}", hexString, hex, hex);

'닷넷 프레임워크' 카테고리의 다른 글

데이터 배열 복사 성능 비교  (1) 2010.01.30
c# UI 쓰레드 마샬링 - Invoke, BeginInvoke  (0) 2010.01.08
memset in c#  (0) 2009.12.20
UDP 통신  (0) 2009.11.26
[C#] 실행시간 측정  (0) 2009.10.20
C에서 배열을 한꺼번에 초기화 시킬 수 있듯이 C#에서도 아래의 방법처럼 가능하다.
byte[] data = new byte[10];
Array.Clear(data, 0, data.Length);

 UDP 어플리케이션은 코드상으로 서버와 클라이언트 구분이 없다. 하지만 구현상 그 기능으로 서버와 클라이언트를 구별한다. 코드를 살펴보면 서버와 클라이언트는 별 반 차이가 없다.

주의
서버와 클라이언트 모두 동일한 UDP 포트 번호를 바인드하기 때문에 서로 다른 시스템에서 실행시켜야 된다.

서버 코드
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDP
{
    class Server
    {
        static void Main(string[] args)
        {
            const int port = 0513;
            byte[] buff = null;
            int recv;

            /* 로컬 IPEndPoint, 서버 주소와 포트가 된다.
             * 서버 주소를 192.168.0.10으로 고정하기 위해서는
             * IPAddress.Parse("192.168.0.10", port)를 사용해야 한다.
             * 여기서는 서버 주소가 고정이 아니기 때문에 IPAddress.Any를 사용한다.
             */
            IPEndPoint ipepLocal = new IPEndPoint(IPAddress.Any, port);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            /* 서버에서 broadcast로 데이터를 전송하기 위해서는 소켓 옵션을 설정해야 한다. */
            server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
           
            /* 로컬 시스템의 0513포트에 바인드한다.
             * UDP 서버 프로그램에 들어오는 UDP패킷을 수신하기 위해서는 로컬 시스템의 특정 포트에 바인드되어야 한다.
             * 로컬 시스템에는 한번에 하나의 프로그램만이 특정 포트 번호에 바인드할 수 있다. 따라서 이미 사용중인 포트 번호로 바인드할 수 없다.
             */
            server.Bind(ipepLocal);


            /* 목적지 IPEndPoint, 서버와 통신하는 클라이언트의 주소와 포트가 된다.
             * 데이터를 전송할 클라이언트 IP를 192.168.0.11으로 고정하기 위해서는 IPAddress.Parse("192.168.0.11", port)를 사용한다.
             * broadcast로 날릴경우 IPAddress.Broadcast로 설정한다.
             */
            IPEndPoint ipepDest = new IPEndPoint(IPAddress.Parse("192.168.0.11"), port);
            EndPoint remote = (EndPoint)ipepDest;

            // 에코 루틴
            while (true)
            {
                buff = new byte [1024];
                recv = server.ReceiveFrom(buff, ref remote);
                string recvStr = Encoding.ASCII.GetString(buff, 0, recv);
                Console.WriteLine("{0}\t{1}", remote.ToString(), recvStr);

                if (recvStr == "exit") break;

                server.SendTo(buff, recv, SocketFlags.None, ipepDest);
                Console.WriteLine("{0}\t{1} 전송", ipepDest.ToString(), recvStr);
            }

            server.Close();
        }
    }
}



클라이언트 코드
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace UDPClient
{
    class Client
    {
        static void Main(string[] args)
        {
            const int port = 0513;
            byte[] buff = null;
            int recv;

            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            // 로컬 IP, port
            IPEndPoint ipepLocal = new IPEndPoint(IPAddress.Any, port);
            EndPoint remote = (EndPoint)ipepLocal;
            client.Bind(ipepLocal);

            // 접속할 서버 IP
            IPEndPoint ipepDest = new IPEndPoint(IPAddress.Parse("192.168.0.10"), port);

            while (true)
            {
                string inputStr = Console.ReadLine();
                client.SendTo(Encoding.ASCII.GetBytes(inputStr), ipepDest);
                if (inputStr == "exit") break;

                buff = new byte[1024];
                recv = client.ReceiveFrom(buff, ref remote);
                string recvStr = Encoding.ASCII.GetString(buff, 0, recv);
                Console.WriteLine("{0}\t{1}", remote.ToString(), recvStr);
            }

            Console.WriteLine("Stopping client");
            client.Close();
        }
    }
}


using System.Diagnostics;

Stopwatch sw = new Stopwatch();
sw.Start();

for (int i = 0; i < 1000000; i++) ;

sw.Stop();
Console.WriteLine("{0}ms", sw.ElapsedMilliseconds);

닷넷 2.0 이상에서만 지원한다.

'닷넷 프레임워크' 카테고리의 다른 글

memset in c#  (0) 2009.12.20
UDP 통신  (0) 2009.11.26
MDB에서 쿼리문에 이상이 없는데도 구문 오류가 발생할 경우  (0) 2009.09.24
텍스트 박스 유효성 체크  (0) 2009.09.22
C# Thread 이야기  (0) 2009.09.22

이상이 생기는 sql 구문
string sql = @"insert into PowerData(EquipCode,PowerState,Time) values(@equipcode, @powerstate, @time) ";

뭐가 문젠지 한참을 고민했다. 분명히 SQL 구문는 정상인데..
이럴 경우 테이블명과 필드명에 [, ] 로 묶어준다.


이상이 없는 sql 구문
string sql = @"insert into [PowerData]([EquipCode],[PowerState],[Time]) values(@equipcode, @powerstate, @time) ";

'닷넷 프레임워크' 카테고리의 다른 글

UDP 통신  (0) 2009.11.26
[C#] 실행시간 측정  (0) 2009.10.20
텍스트 박스 유효성 체크  (0) 2009.09.22
C# Thread 이야기  (0) 2009.09.22
Creating a splash screen  (0) 2009.07.15

using System.Text.RegularExpressions;

// 텍스트박스에 한글만 입력하기


private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)

{

    if((Char.IsPunctuation(e.KeyChar) || Char.IsDigit(e.KeyChar) || Char.IsLetter 

          (e.KeyChar) || Char.IsSymbol(e.KeyChar)) && e.KeyChar != 8)

    {

        e.Handled = true;

    }

}

 

// 텍스트 박스에 영문만 입력하기

private void textBox1_Leave(object sender, System.EventArgs e)

{

    Regex emailregex = new Regex(@"[a-zA-Z]");

    Boolean ismatch = emailregex.IsMatch(textBox1.Text);

    if (!ismatch)

    {

        MessageBox.Show("영문자만 입력해 주세요.");

    }

}

// 텍스트 박스에 숫자만 입력하기
// textBox1의 문자 중 숫자를 없앤다.
string str = Regex.Replace(this.textBox1.Text, @"[0-9]", "");
if(str.Length > 0)
     MessageBox.Show(“숫자외 문자가 존재합니다.“);
else
     MessageBox.Show(“숫자로만 구성되어있습니다.“);

'닷넷 프레임워크' 카테고리의 다른 글

[C#] 실행시간 측정  (0) 2009.10.20
MDB에서 쿼리문에 이상이 없는데도 구문 오류가 발생할 경우  (0) 2009.09.24
C# Thread 이야기  (0) 2009.09.22
Creating a splash screen  (0) 2009.07.15
DataGridView 소개  (1) 2009.07.13

C# 쓰레드 이야기: 1. 쓰레드는 무엇인가?

http://network.hanbitbook.co.kr/view.php?bi_id=229

 

C# 쓰레드 이야기: 2. 다중 쓰레드

http://network.hanbitbook.co.kr/view.php?bi_id=231

 

C# 쓰레드 이야기: 3. 쓰레드 제어

http://network.hanbitbook.co.kr/view.php?bi_id=233

 

C# 쓰레드 이야기: 4. 쓰레드 기본 개념

http://network.hanbitbook.co.kr/view.php?bi_id=239

 

C# 쓰레드 이야기: 5. NT vs UNIX

http://network.hanbitbook.co.kr/view.php?bi_id=243

 

C# 쓰레드 이야기: 6. 쓰레드 예외 처리

http://network.hanbitbook.co.kr/view.php?bi_id=246

 

C# 쓰레드 이야기: 7. C#으로 만드는 WinTop

http://network.hanbitbook.co.kr/view.php?bi_id=255

 

C# 쓰레드 이야기: 8. 동기화

http://network.hanbitbook.co.kr/view.php?bi_id=318

 

C# 쓰레드 이야기: 9. 임계 영역

http://network.hanbitbook.co.kr/view.php?bi_id=330

 

C# 쓰레드 이야기: 10. 뮤텍스(Mutex)

http://network.hanbitbook.co.kr/view.php?bi_id=332

 

C# 쓰레드 이야기: 11. 이벤트(Event)

http://network.hanbitbook.co.kr/view.php?bi_id=360

 

C# 쓰레드 이야기 - 12. 식사하는 철학자

http://network.hanbitbook.co.kr/view.php?bi_id=377

 

C# 쓰레드 이야기 - 13. Interlocked, Heap

http://network.hanbitbook.co.kr/view.php?bi_id=379

 

C# 쓰레드 이야기 - 14. 마지막 이야기

http://network.hanbitbook.co.kr/view.php?bi_id=426

Let's start by creating a new C# Windows Application ( File -> New -> Project -> Visual C# Projects -> Windows Application ). Name the project SplashScreen.

   Let's leave the current form the way it is and add to our project another form. To do this, go to Project menu and click Add Windows Form. Name the class Splash.cs and click OK.

   Visual Studio .NET has created another form for you. Let's work a little on our new form. Let's set it's FormBorderStyle to None its StartPosition to CenterScreen. In the attached archive, I've created a simple image witch we will set as the BackgoundImage for our current form. Resize the form until it displays the full image. Now set the TransparencyKey property of our form to the background color of our image. As you can see, the color is Black. Also, it would be nice that this form would not be displayed in the taskbar. So set the ShowInTaskbar property to false.

   Now go back to Form1 class, created by default by Visual Studio .NET. We must add some code in this class to show the Splash form before initializing Form1.

   Let's go to Form1() method. That method is the constructor of the class and it executes before any other method. Let's add here the following code, right bellow the call to InitializeComponent method:

Thread th = new Thread(new ThreadStart(DoSplash));
th.Start();
Thread.Sleep(3000);
th.Abort();
Thread.Sleep(1000);

   Let's see what is done here. Fist, we declare a thread and tell him that when he starts, to execute the DoSplash method. The next line starts the thread. Now the started thread executes in parallel with the main application thread. To prevent the main form from appearing before the thread exits, we put the main thread to sleep for 3 seconds( 3000 milliseconds ).To be sure that the second thread will exit, we’ll leave him an extra 1 second to cleanup. . Let’s take a look at the DoSplash method that our second thread executes:

Splash sp = new Splash();
sp.ShowDialog();


   Let's see what is happening here. We declared an instance of our Splash class and displayed it. When we'll call the abort method of the thread, all the variable declared or instantiated in that thread will be disposed.

   Run the application now and see what happens. On my computer, the image is displayed correctly only if I set the color depth of my computer to 16 bits. This is a bug from Microsoft. After a few searches on google, you will find there is a fix for that. So let's fix it.

   Go to the Splash class constructor, and add the following code, after the InitializeComponent method:

Bitmap b = new Bitmap(this.BackgroundImage);
b.MakeTransparent(b.GetPixel(1,1));
this.BackgroundImage = b;
 

   What our code does is get the image we set as BackgroundImage and creates a Bitmap object as a copy of the same image. Next, we call MakeTransparent method of the Bitmap class that gets a color as an argument and makes it transparent. The argument that we pass is the color of the pixel at coordinates 1,1(these coordinates are not the only ones that you can use. You can use as well 0,0 and any other.).

   Here is the splash on my machine.



That's about it. Until next time, I wish you luck and happy programming.
[출처]
CodeSource.net

'닷넷 프레임워크' 카테고리의 다른 글

텍스트 박스 유효성 체크  (0) 2009.09.22
C# Thread 이야기  (0) 2009.09.22
DataGridView 소개  (1) 2009.07.13
MySQL 5.1과 C# 연동  (0) 2009.05.31
Thread 상태 전이도  (0) 2009.05.20

새 데이터 표 소개

Matthew MacDonald
새로운 DataGridView는 .NET 1.x의 표준이었으며 안타깝게도 제 역할을 하지 못한 DataGrid 컨트롤에 대해 .NET 2.0이 제시하는 해결책입니다. Matthew MacDonald가 아래에서 설명할 많은 개선 사항 중에서도 DataGridView는 광범위한 사용자 지정 및 세부적인 서식 지정, 유연한 크기 조정 및 선택, 뛰어난 성능 그리고 다양한 이벤트 모델을 지원합니다.
 
.NET Framework의 처음 두 릴리스(.NET 1.0 및 .NET 1.1)는 데이터 바인딩 부문에서 명백한 차이를 남겼습니다. 개발자들은 거의 모든 컨트롤을 거의 모든 데이터 원본에 연결할 수 있는 유연하고 구성 가능한 모델을 가지고 있었지만 전체 정보 테이블을 표시하기 위한 실질적인 방법은 없었습니다. 이를 위해 포함된 유일한 도구는 DataGrid 컨트롤로, 간단한 데모에서는 원활하게 작동했지만 실제 코드에서는 턱없이 부족한 성능을 나타냈습니다.
Microsoft는 이러한 격차를 줄이는 것을 .NET 2.0의 핵심 목표로 삼아 완전히 새로운 표 컨트롤인 DataGridView로 문제를 해결했습니다. DataGridView의 주요 원칙은 두 가지입니다. 먼저, 이 컨트롤은 단 몇 줄의 코드만 작성하여 마스터-세부 목록, 유효성 검사 및 데이터 서식 지정 같은 일반적인 작업을 지원하는 것을 목표로 합니다. 또한 무엇보다도 낮은 수준의 해킹 및 "편법" 프로그래밍에 의지하지 않고 필요한 특수 기능을 통합할 수 있도록 처음부터 확장성을 염두에 두고 디자인되었습니다.


기본적인 데이터 바인딩

DataGridView에 익숙해지는 가장 효과적인 방법은 속성을 하나도 구성하지 않고 직접 사용해 보는 것입니다. DataGrid와 마찬가지로 DataSource 속성을 사용하여 DataTable 개체(또는 DataTable에서 파생된 개체)를 바인딩할 수 있습니다.

          Dim ds As DataSet = GetDataSet()
          DataGridView1.DataSource = ds.Tables("Customers")
          
          
DataGrid와 달리 DataGridView는 테이블을 한 번에 하나씩만 나타낼 수 있습니다. 전체 DataSet를 바인딩하는 경우 나타낼 테이블 이름으로 DataMember 속성을 설정하지 않으면 아무런 데이터도 표시되지 않습니다.
          DataGridView1.DataSource = ds
          DataGridView1.DataMember = "Customers"
          
          
기본적인 DataGridView 표시는 다음과 같은 몇 가지 간단한 규칙을 따릅니다.
  • 데이터 원본의 각 필드에 대해 한 열씩 만듭니다.
  • 필드 이름을 사용하여 열 헤더를 만듭니다. 열 헤더는 고정되어 있어 사용자가 목록 아래로 이동해도 계속 볼 수 있습니다.
  • Windows XP 방식의 표시 스타일을 지원합니다. 열 헤더는 세련된 평면 모양이며 사용자가 헤더 위로 마우스를 이동하면 강조 표시됩니다.
쉽게 눈에 띄지는 않지만 DataGridView에는 다음과 같은 다양한 기본 동작이 포함되어 있습니다.
  • 현재 위치 내 편집이 가능합니다. 사용자는 셀을 두 번 클릭하거나 F2 키를 눌러 현재 값을 수정할 수 있습니다. 유일한 예외는 필드의 DataColumn.ReadOnly가 true로 설정되어 있는 경우입니다(예: 현재 예제의 OrderID 필드).
  • 자동 정렬을 지원합니다. 사용자는 열 헤더를 한 번 또는 두 번 클릭하여 해당 필드의 값을 기반으로 값 순서를 오름차순 또는 내림차순으로 정할 수 있습니다. 기본적으로 정렬은 데이터 형식을 고려하며 사전순 또는 숫자 순서대로 이루어집니다. 사전순 정렬은 대/소문자를 구분합니다.
  • 다양한 형식을 선택할 수 있습니다. 사용자는 클릭하여 끌어 오는 방식으로 하나 이상의 셀 또는 여러 행을 강조 표시할 수 있습니다. DataGridView 왼쪽 위에 있는 사각형을 클릭하면 전체 테이블이 선택됩니다.
  • 자동 크기 조정 기능을 지원합니다. 사용자가 헤더 사이의 열 구분선을 두 번 클릭하면 왼쪽 열이 셀 내용에 맞게 자동으로 확장 또는 축소됩니다.

 

멋진 모양의 DataGridView 만들기

DataGridView의 기본 모양은 DataGrid에 비해 약간 개선되었습니다. 하지만 몇 가지 간단한 세부 작업을 통해 모양을 멋지게 다듬을 수 있습니다.

한 가지 문제는 열이 해당 데이터에 맞게 자동으로 확장되지 않는다는 것입니다. 이 문제는 DataGridView.AutoSizeColumns() 메서드와 DataGridViewAutoSizeColumnCriteria 열거형 값 중 하나를 사용하여 해결할 수 있습니다. 열의 크기는 헤더 텍스트 너비, 현재 표시된 행 또는 테이블의 모든 행을 기반으로 조정하도록 선택할 수 있습니다.
          ' 헤더에서 가장 큰 텍스트의 너비
          ' 또는 이 열의 행 중 하나에 대해
          ' 열 크기를 조정합니다.
          DataGridView1.AutoSizeColumns( _
            DataGridViewAutoSizeColumnCriteria.HeaderAndRows)
          
                  '자동 셀 크기 조정
                  dv1.AutoResizeColumns()
                  dv1.AutoResizeRows()
          
           
          

(참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.)

이 메서드는 데이터 바인딩이 끝난 후 호출해야 하며 그렇지 않으면 어떤 영향도 미치지 않습니다. 또한 사용자가 편집한 후에 사용하는 경우도 있습니다(DataGridView.CellValueChanged 같은 이벤트에 대한 응답으로).
이에 맞게 열 크기를 넓히는 대신 행 크기를 변경할 수도 있습니다. 기본적으로 열의 텍스트는 여러 줄에 겹치게 됩니다. DataGridView.AutoSizeRows() 메서드를 사용하는 경우 행은 내용에 맞게 높이가 조정됩니다. 특히 필드에 텍스트의 양이 많은 경우에는 이 메서드를 사용하기 전에 열 크기를 넓혀야 할 수 있습니다. 예를 들어 다음 코드 조각은 Descript-xion 열의 크기를 네 배로 늘린 다음 내용에 맞게 행의 크기를 조정합니다.
          DataGridView.Columns("Descript-xion").Width *= 4
          DataGridView.AutoSizeRows( _
            DataGridViewAutoSizeRowsMode.HeaderAndColumnsAllRows)
          
          
그림 1에서는 DataGridView의 크기를 자동으로 조정하는 서로 다른 접근 방식을 비교합니다.
또 다른 적절한 변화 중 하나로 각 열에 나타나는 헤더 텍스트를 변경하는 기능을 들 수 있습니다. 예를 들어 필드 이름인 "OrderDate"보다는 "Order Date"라는 제목을 붙이는 것이 보다 전문적인 느낌을 줍니다. 이러한 변화는 매우 간단하게 이루어집니다. 다음과 같이 DataGridView.Columns 컬렉션에서 적절한 DataGridViewColumn을 검색한 다음 해당 HeaderText 속성을 수정하면 됩니다.
          DataGridView.Columns("OrderID").HeaderText = "Order ID"
          
          

DataGridView를 사용하여 셀 선택

DataGridView를 사용하면 기본적으로 자유로운 선택이 가능합니다. 사용자는 개별 셀, 셀 그룹, 모든 셀을 한 번에(표 오른쪽 위의 사각형을 클릭하여) 또는 하나 이상의 행(헤더 열의 행을 클릭하여)을 강조 표시할 수 있습니다. 선택 모드에 따라 사용자는 열 헤더를 선택하여 하나 이상의 열을 선택할 수도 있습니다. 이 동작을 제어하려면 다음 설명과 같이 DataGridViewSelectionMode 열거형 값 중 하나로 DataGridView.SelectionMode 속성을 선택합니다.
  • CellSelect 셀은 선택할 수 있지만 전체 행 또는 헤더는 선택할 수 없습니다. DataGridView.MultiSelect가 True이면 여러 개의 셀을 선택할 수 있습니다.
  • FullColumnSelect 열 헤더를 클릭하여 전체 열만 선택할 수 있습니다. DataGridView.MultiSelect가 True이면 여러 개의 열을 선택할 수 있습니다. 이 모드를 사용하면 열 헤더를 클릭해도 표가 정렬되지 않습니다.
  • FullRowSelect 행 헤더를 클릭하여 전체 행만 선택할 수 있습니다. DataGridView.MultiSelect가 True이면 여러 개의 행을 선택할 수 있습니다.
  • ColumnHeaderSelect CellSelect 또는 FullColumnSelect 선택 모드를 사용할 수 있습니다. 이 모드를 사용하면 열 헤더를 클릭해도 표가 정렬되지 않습니다.
  • RowHeaderSelect CellSelect 또는 FullRowSelect 선택 모드를 사용할 수 있습니다. 이것이 기본 선택 모드입니다.
DataGridView는 다음 세 가지 속성을 사용하여 선택한 셀을 손쉽게 검색할 수 있도록 해줍니다. SelectedCells, SelectedRows 및 SelectedColumns. SelectedCells는 사용하는 선택 모드에 관계 없이 DataGridViewCell 개체의 컬렉션을 반환합니다. 반면 SelectedRows는 행 헤더를 선택하여 전체 행을 선택한 경우 정보만 반환하며 SelectedColumns는 열 헤더를 사용하여 전체 열을 선택한 경우 정보만 반환합니다.
예를 들어 다음 코드 조각은 선택한 전체 행을 확인합니다. 행을 찾으면 다음과 같이 메시지 상자에 CustomerID 열의 해당 값을 표시합니다.
          For Each SelectedRow As DataGridViewRow In _
            DataGridView1.SelectedRows
              MessageBox.Show( _
                SelectedRow.Cells("CustomerID").Value)
          Next
          
          
이 작업은 CurrentCell 또는 CurrentCellAddress 속성을 사용하여 현재 셀에 대한 참조를 검색하는 것만큼이나 간단합니다. DataGridView를 사용하면 현재 셀이 검정 점선 사각형 모양의 포커스 영역으로 둘러싸입니다. 이 영역이 현재 사용자의 위치입니다.
CurrentCellAddress 속성은 읽기 전용이지만 CurrentCell을 사용하면 현재 위치를 프로그래밍 방식으로 변경할 수 있습니다. 그런 후에 현재 위치가 표시되도록 DataGridView가 스크롤됩니다.
          ' 11번째 행의 네 번째 셀로 이동합니다.
          DataGridView.CurrentCell = _
            DataGridView.Rows(10).Cells(3)
          
          
DataGridView 개체

지금까지는 현재 선택한 행, 셀 및 열 집합과 상호 작용하는 방법을 확인했습니다. DataGridView는 전체 데이터 집합을 작업할 수 있게 해주는 두 개의 주요 컬렉션을 제공합니다. 이들은 Columns(DataGridViewColumn 개체의 컬렉션) 및 Rows(각각 DataGridViewCell 개체의 컬렉션을 참조하는 DataGridViewRow 개체의 컬렉션)로 나타납니다. 그림 2는 개체 모델을 보여 줍니다.

일반적으로 열 표시 속성, 서식 지정 및 헤더 텍스트를 구성하려면 DataGridViewColumn 개체를 사용합니다. 또한 DataGridViewRow 및 DataGridViewCell 개체는 바인딩된 레코드에서 실제 데이터를 검색하는 데 사용합니다. DataGridViewCell의 데이터를 수정하면 다음과 같이 사용자가 편집하는 것과 동일한 방식으로 처리됩니다. 적절한 DataGridView 변경 이벤트가 발생되면 기본 DataTable이 수정됩니다.
이제 DataGridView 개체 모델을 이해했으므로 테이블을 순환하는 코드를 쉽게 만들 수 있습니다. 행, 열 또는 셀을 선택하기 위해 해야 할 일은 해당하는 DataGridViewRow, DataGridViewColumn 또는 DataGridViewCell 개체를 찾아 IsSelected 속성을 true로 설정하는 것뿐입니다.
다음 예제는 OrderID 필드가 100 미만인 모든 행을 프로그래밍 방식으로 선택합니다.
          For Each Row As DataGridViewRow In DataGridView1.Rows
              If Row.Cells("OrderID").Value < 100 Then
                  Row.Selected = True
              End If
          Next
          
          
DataGridViewColumn에서 여러 개의 서로 다른 클래스가 파생되는 것에는 신경쓰지 않아도 됩니다. 이러한 클래스는 셀에서 값을 그리고 편집하는 방식을 제어할 수 있습니다. .NET에는 다음과 같은 5개의 미리 빌드된 DataGridView 열 클래스가 포함되어 있습니다. DataGridViewButtonColumn, DataGridViewCheckBoxColumn, DataGridViewComboBoxColumn, DataGridViewImageColumn 및 DataGridViewTextBoxColumn.

 

DataGridView 스타일

DataGridView를 디자인하는 데 발생하는 한 가지 문제는 서로 다른 수준의 서식 지정을 적용할 만큼 유연하면서 매우 큰 테이블에 대해서도 효과적인 서식 지정 시스템을 만드는 것이었습니다. 유연성을 고려할 경우 최상의 접근 방식은 개발자가 각 셀을 개별적으로 구성할 수 있게 하는 것입니다. 그러나 효율성 측면에서 보면 이 접근 방식은 매우 열악하다고 할 수 있습니다. 테이블에 행이 수천 개면 셀은 수만 개가 되므로 셀마다 개별적으로 서식 지정을 관리한다는 것은 보나마나 많은 양의 메모리만 낭비하는 헛수고가 될 것입니다.

이 문제를 해결하기 위해 DataGridView는 DataGridViewCellStyle 개체를 사용하는 다계층 모델을 사용합니다. DataGridViewCellStyle 개체는 셀의 스타일을 나타내며 색, 글꼴, 맞춤, 줄 바꿈 및 데이터 서식 지정 같은 세부 사항이 포함되어 있습니다. 단일 DataGridViewCellStyle을 만들면 전체 테이블의 기본 서식을 지정할 수 있습니다. 또한 열, 행 및 개별 셀에 대해 기본 서식을 지정할 수 있습니다. 서식을 보다 세부적으로 지정할수록 더 많은 DataGridViewCellStyle 개체를 만들며 솔루션의 확장 가능성은 떨어지게 됩니다. 그러나 주로 열 기반 및 행 기반 서식 지정을 사용하고 개별 셀의 서식은 가끔씩 지정하는 경우 DataGridView의 메모리가 DataGrid보다 훨씬 많을 필요는 없습니다.
DataGridView는 서식 지정을 적용할 때 다음과 같은 우선 순위를 따릅니다(내림차순으로).
1. DataGridViewCell.Style
2. DataGridViewRow.DefaultCellStyle
3. DataGridView.AlternatingRowsDefaultCellStyle
4. DataGridView.RowsDefaultCellStyle
5. DataGridViewColumn.DefaultCellStyle
6. DataGridView.DefaultCellStyle
여기서 이해해야 할 부분은 스타일 개체가 전혀 적용되지 않는다는 점입니다. 대신 DataGridView는 각 개별 속성을 확인합니다. 예를 들어 DataGridViewCell.Style 속성을 사용하여 사용자 지정 글꼴을 적용하지만 사용자 지정 전경색은 설정하지 않는 셀이 있다고 가정합시다. 이렇게 되면 글꼴 설정은 다른 모든 스타일 개체의 글꼴 정보보다 우선하여 적용되지만 전경색은 null이 아닌 경우 계층 구조의 다음 스타일 개체에서 상속됩니다(이 경우 DataGridViewRow.DefaultCellStyle).
DataGridViewCellStyle은 다음과 같은 두 가지 유형의 서식 지정을 정의합니다. 데이터 및 모양. 데이터 서식 지정이란 데이터 바인딩된 값이 표시되기 전에 수정되는 방식을 지정하는 것을 말합니다. 여기에는 일반적으로 서식 지정 문자열을 사용하여 숫자 또는 날짜 값을 텍스트로 전환하는 작업이 포함됩니다. 데이터 서식 지정을 사용하려면 DataGridViewCellStyle.Format 속성을 사용하여 형식 지정자 또는 사용자 지정 형식 문자열을 설정하면 됩니다.
예를 들어 다음 코드 조각은 UnitCost 필드에 있는 모든 숫자의 서식을 지정하여 이들 숫자가 통화 값으로 표시되고 두 개의 소수 자릿수와 적절한 통화 기호가 로캘 설정에 정의됩니다.
          DataGridView1.Columns("UnitCost"). _
            DefaultCellStyle.Format = "C"
          
          
모양 서식 지정에는 색 및 글꼴 같은 표면적인 묘사가 포함되어 있습니다. 예를 들어 다음 코드는 UnitCost 필드를 오른쪽으로 맞추고 굵은 글꼴을 적용하며 셀 배경을 노랑으로 변경합니다.
          DataGridView1.Columns("UnitCost"). _
            DefaultCellStyle.Font = _
            New Font(DataGridView.Font, FontStyle.Bold)
          DataGridView1.Columns("UnitCost"). _
            DefaultCellStyle.Alignment = _
            DataGridViewContentAlignment.MiddleRight
          DataGridView1.Columns("UnitCost"). _
            DefaultCellStyle.BackColor = Color.LightYellow
          
          
다른 서식 지정 관련 속성에는 ForeColor, SelectionForeColor, SelectionBackColor, WrapMode(공간이 허용되는 경우 텍스트를 여러 줄에 겹치게 할지 잘라낼지 여부를 제어) 및 NullValue(null 값을 대체하는 값)가 있습니다.
또한 DataGridView에는 디자인 타임에 열 스타일을 구성할 수 있게 해주는 디자이너가 포함되어 있습니다. 속성 창에서 DataGridView Properties 링크를 선택하거나 AutoFormat을 선택하여 다양한 미리 빌드된 스타일 설정에서 선택하면 됩니다.

 

사용자 지정 셀 서식 지정

셀의 서식을 지정하기 위해 첫 번째로 선택할 사항은 상위 DataGridView, DataGridViewColumn 및 DataGridViewRow 속성을 통해 작업하는 것입니다. 그러나 때로는 특정 개별 셀의 스타일을 설정해야 하는 경우도 있습니다. 예를 들어 열의 데이터가 특정 값보다 크거나 작으면 데이터를 플래그해야 하는 경우가 있습니다. 이에 대한 한 가지 예는 프로젝트 일정 목록에서 기한이 경과된 만기일 또는 매출 분석에서 마이너스 수익률을 강조 표시하는 것입니다. 위의 두 경우 모두 개별 셀의 서식을 지정해야 합니다.

DataGridView 개체 모델에 대한 지식을 활용하여 값을 강조 표시할 것으로 예상되는 특정 열에서 셀의 컬렉션을 반복하고 싶을 수도 있습니다. 이러한 접근 방식은 사용할 수는 있지만 최선의 선택은 아닙니다. 여기서 중요한 문제는 사용자가 데이터를 편집하거나 코드가 바인딩된 데이터 원본을 변경하는 경우 셀 강조 표시가 일치하도록 업데이트되지 않는다는 것입니다.
다행히도 DataGridView는 이를 위해 CellFormatting 이벤트를 제공합니다. CellFormatting은 셀 값이 그려지기 직전에 발생되며 내용을 기반으로 셀 스타일을 업데이트할 수 있습니다. 다음은 특정 고객을 확인하여 그에 따라 셀을 플래그하는 예제입니다.
          Private Sub DataGridView1_CellFormatting( _
            ByVal sender As System.Object, _
            ByVal e As System.Windows.Forms. _
            DataGridViewCellFormattingEventArgs) _
            Handles DataGridView1.CellFormatting
          
              ' 맞는 열인지 확인합니다.
              If DataGridView1.Columns(e.ColumnIndex).Name = _
                "CustomerID" Then
                  ' 맞는 값인지 확인합니다.
                  If e.Value = "ALFKI" Then
                      e.CellStyle.ForeColor = Color.Red
                      e.CellStyle.BackColor = Color.Yellow
                  End If
              End If
          End Sub
          
          
표의 모양에 영향을 주는 세부 사항은 스타일뿐만이 아닙니다. 사용자가 오른쪽으로 스크롤하더라도 계속 표시되도록 열을 숨기고 위치를 이동하며 잠글 수도 있습니다. 이러한 기능은 모두 다음 설명과 같이 DataGridViewColumn 클래스의 속성을 통해 제공됩니다.
  • DisplayIndex DataGridView에서 열이 표시되는 위치를 설정합니다. 예를 들어 DisplayIndex가 0인 열은 가장 왼쪽 열에 자동으로 표시됩니다. DisplayIndex가 동일한 열이 둘 이상이면 컬렉션의 첫 번째 열이 가장 먼저 표시됩니다. 따라서 DisplayIndex를 사용하여 열을 왼쪽으로 옮기는 경우 가장 왼쪽 열의 DisplayIndex도 오른쪽으로 옮기도록 설정해야 합니다. 처음에 DisplayIndex는 DataGridView.Columns 컬렉션의 DataGridViewColumn 개체의 인덱스와 일치합니다.
  • Frozen True인 경우 사용자가 추가 열을 확인하기 위해 오른쪽으로 스크롤해도 테이블 왼쪽에 표시된 상태로 고정됩니다.
  • HeaderText 열 헤더에 표시되는 텍스트를 설정합니다.
  • Resizable 및 MinimumWidth Resizable을 False로 설정하여 사용자가 열 크기를 조정하지 못하게 하거나 MinimumWidth를 최소 허용 픽셀 수로 설정합니다.
  • Visible False로 설정하여 열을 숨깁니다.

단추 열

DataGridView를 위해 제공되는 열 형식 중 하나는 모든 항목 옆에 단추를 표시하는 DataGridViewButtonColumn입니다. 이 단추의 클릭에 응답하는 것은 물론 이를 사용하여 다른 작업을 시작하거나 새 폼을 표시할 수도 있습니다.

다음은 단추 텍스트가 "Details..."인 간단한 단추 열을 만드는 예제입니다.
          ' 단추 열을 만듭니다.
          Dim Details As New DataGridViewButtonColumn()
          Details.Name = "Details"
          
          ' 데이터 바인딩을 해제하고 정적 텍스트를 표시합니다.
          ' (대신 DataPropertyName 속성을 설정하여
          ' 테이블의 속성을 사용할 수도 있습니다.)
          Details.DisplayTextAsFormattedValue = False
          Details.Text = "Details..."
          
          ' 헤더를 지웁니다.
          Details.HeaderText = ""
          
          ' 열을 추가합니다.
          DataGridView1.Columns.Insert( _
            DataGridView1.Columns.Count, Details)
          
          
그림 3은 새 열이 표시된 표를 보여 줍니다. 다음은 모든 열에서 단추 클릭에 반응하여 해당되는 레코드 정보를 표시하는 코드입니다.
          Private Sub DataGridView1_CellClick( _
            ByVal sender As System.Object, _
            ByVal e As System.Windows.Forms. _
            DataGridViewCellEventArgs) _
            Handles DataGridView1.CellClick
          
              If DataGridView1.Columns(e.ColumnIndex).Name = _
                "Details" Then
                  MessageBox.Show("You picked " & _
                    DataGridView1.Rows(e.RowIndex). _
                    Cells("CustomerID").Value)
              End If
          End Sub
          
          
좀 더 현실적인 시나리오에서는 여기서 새 창을 만들고 표시한 다음 선택한 레코드에 대한 정보를 새 창으로 전달하여 전체 정보를 쿼리하고 표시할 수 있도록 합니다.

이미지 열

DataGridView를 위해 제공되는 또 다른 열 형식은 셀 범위에 그림을 표시하는 DataGridViewImageColumn입니다. DataGridViewImageColumn.Layout 속성을 설정하면 크기에 맞게 늘이든 너무 큰 경우 그냥 잘라내든 간에 셀에 그림이 표시되는 방법을 구성할 수 있습니다.

DataGridViewImageColumn은 다음 두 가지 방법으로 사용할 수 있습니다. 먼저, DataGridViewButtonColumn과 동일한 방식으로 직접 이를 만들어 추가할 수 있습니다. 이 방법은 DataSet에 제공되지 않는 관련된 이미지 데이터를 표시하려는 경우에 유용합니다. 예를 들어 파일 이름(예: ProductPic002.gif)을 가져와 네트워크 드라이브에서 해당 파일을 읽은 다음 이를 표에 표시하는 경우가 있습니다. 이를 수행하려면 CellFormatting처럼 DataGridView 이벤트에 반응해야 하며, 이 때 열의 Value 속성을 사용하여 해당하는 행의 그림을 읽고 이미지 데이터를 가져오며 이를 삽입합니다.
DataSet에 수작업이 필요 없는 이진 그림 데이터가 들어 있으면 상황은 훨씬 간단해집니다. 이에 대한 한 가지 예는 회사 로고가 포함되어 있는 SQL Server pubs 데이터베이스의 pub_info 테이블입니다. 이 테이블에 바인딩할 때는 추가 단계를 수행할 필요 없이 DataGridView가 현재 이미지를 사용하고 있음을 자동으로 인식하여 필요한 DataGridViewImageColumn을 만들어 줍니다. (이 기법의 예제는 이 기사의 다운로드를 참조하십시오.)

DataGridView를 사용하는 편집

DataGrid는 사용자 입력에 유연성이 떨어지기로 악명 높아 셀의 유효성을 검사하고 오류를 보고하는 방식을 사용자 지정하기가 거의 불가능했습니다. 반면 DataGridView를 사용하면 편집 프로세스의 모든 단계에서 발생하는 수많은 서로 다른 단계에 반응하여 동작을 제어할 수 있습니다.

기본적으로 DataGridView 셀은 사용자가 마우스로 셀을 두 번 클릭하거나 F2 키를 누르면 편집 모드로 들어갑니다. 또한 DataGridView.EditCellOnEnter 속성을 true로 설정하면 사용자가 셀로 이동하자마자 편집 모드로 전환되도록 DataGridView를 구성할 수 있습니다. DataGridView의 BeginEdit(), CancelEdit(), CommitEdit() 및 EndEdit() 메서드를 사용하여 셀 편집을 프로그래밍 방식으로 시작 및 중단할 수도 있습니다. 사용자가 셀을 편집하면 행 헤더에 연필 모양의 편집 아이콘이 표시됩니다.
사용자가 Esc 키를 누르면 편집을 취소할 수 있습니다. EditCellOnEnter 속성을 true로 설정하면 셀이 편집 모드로 유지되지만 모든 변경 내용이 삭제됩니다. 변경을 커밋하려면 사용자가 새로운 셀로 이동하거나 포커스를 다른 컨트롤로 변경하면 됩니다. 코드에서 현재 셀 위치를 옮기면 변경 내용도 함께 커밋됩니다.
셀을 편집하지 못하게 하려면 DataGridViewCell, DataGridViewColumn, DataGridViewRow 또는 DataGridView의 ReadOnly 속성을 설정하면 됩니다(변경하지 못하게 하려는 대상이 해당 셀인지, 해당 열의 모든 셀인지, 해당 행의 모든 셀인지 또는 테이블의 모든 셀인지에 따라 다름). DataGridView는 또한 시도한 편집을 취소하기 위해 처리할 수 있는 CellBeginEdit 이벤트를 노출합니다.

오류 처리

기본적으로 DataGridViewTextBoxColumn을 사용하면 사용자가 현재 셀에 허용되지 않을 수 있는 문자를 포함하여 모든 문자를 입력할 수 있습니다. 예를 들어 사용자가 숫자 필드에 숫자가 아닌 문자를 입력하거나 DataSet에 정의된 ForeignKeyConstraint 또는 UniqueConstraint를 위반하는 값을 지정할 수도 있습니다. DataGridView는 이러한 문제를 다음과 같이 다양한 방식으로 처리합니다.

  • 편집한 값을 필요한 데이터 형식으로 변환할 수 있으면(예: 사용자가 숫자 열에 텍스트를 입력한 경우) 사용자는 변경 내용을 커밋하거나 다른 행으로 이동할 수 없게 됩니다. 대신 변경 내용을 취소하거나 값을 편집해야 합니다.
  • 편집한 값이 DataSet의 제약 조건을 위반하는 경우 사용자가 다른 행으로 이동하거나 Enter 키를 눌러 이를 커밋하고 나면 바로 변경 내용이 취소됩니다.
이처럼 명백한 기본값은 대부분의 시나리오에서 원활하게 적용됩니다. 그러나 필요한 경우 DataGridView가 데이터 원본에서 오류를 차단할 때 발생하는 DataGridView.DataError 이벤트에 응답하여 오류 처리에 참가할 수도 있습니다.

입력 유효성 검사

유효성 검사는 오류 처리와는 약간 다른 작업입니다. 오류 처리의 경우 DataSet를 통해 보고되는 문제를 처리합니다. 하지만 유효성 검사의 경우 DataSet에는 허용될 수 있지만 응용 프로그램에는 적절하지 않은 데이터 같은 고유한 사용자 지정 오류 조건을 찾아냅니다.

사용자가 새로운 셀로 이동하여 변경 내용을 커밋하면 DataGridView 컨트롤은 CellValidating 및 CellValidated 이벤트를 발생시킵니다. 또한 이러한 이벤트 다음에는 RowValidating 및 RowValidated 이벤트가 발생됩니다. 여러분은 이러한 이벤트에 응답하고 사용자가 입력한 값이 올바른지 확인하며 필요한 처리 후 작업을 수행할 수 있습니다. 값이 올바르지 않으면 일반적으로 변경 내용 및 셀 탐색을 취소하거나(EventArgs 개체의 Cancel 속성을 true로 설정하여) 사용자에게 알려줄 몇 가지 오류 텍스트를 설정하여 응답하게 됩니다. 오류 텍스트는 다른 컨트롤에 배치하거나 다음과 같이 해당하는 DataGridViewRow 및 DataGridViewCell의 ErrorText 속성을 사용하여 DataGrid에 표시할 수 있습니다.
  • DataGridViewCell.ErrorText를 설정하면 셀에 느낌표 아이콘이 표시됩니다. 마우스로 이 아이콘을 가리키면 오류 메시지가 표시됩니다.
  • DataGridViewRow.ErrorText를 설정하면 행 왼쪽의 행 헤더에 느낌표 아이콘이 표시됩니다. 마우스로 이 아이콘을 가리키면 오류 메시지가 표시됩니다.
일반적으로 이들 속성은 모두 함께 사용하며 행과 셀 모두에 오류 메시지를 설정하게 됩니다. 다음은 CompanyName 필드의 너무 긴 텍스트 항목을 확인하는 예제입니다. 문제가 되는 값을 발견하면 문제가 설명된 도구 설명 텍스트와 함께 오류 그림(빨강 느낌표 표시)이 셀에 추가됩니다.
          Private Sub DataGridView1_CellValidating( _
            ByVal sender As System.Object, _
            ByVal e As System.Windows.Forms. _
            DataGridViewCellValidatingEventArgs) _
            Handles DataGridView1.CellValidating
          
              If DataGridView1.Columns(e.ColumnIndex).Name = _
                "CompanyName" Then
                  If CType(e.FormattedValue, String).Length > _
                    50 Then
                      DataGridView1.Rows( _
                        e.RowIndex).Cells(e.ColumnIndex). _
                        ErrorText = _
                        "회사 이름이 너무 깁니다."
                  End If
              End If
          End Sub
          
          
목록 열로 선택 사항 제한

유효성 검사를 사용하면 모든 오류 조건을 잡아낼 수 있습니다. 그러나 이 접근 방식을 사용하면 잘못된 내용을 입력한 다음 이를 사후에 수정할 수 있기 때문에 반드시 최선의 방법이라고 할 수는 없습니다. 보다 바람직한 방법은 우선 사용자가 잘못된 내용을 입력하지 못하도록 하는 것입니다.

한 가지 일반적인 예는 열을 미리 정의한 값 목록으로 제한해야 하는 경우에 나타납니다. 이 시나리오에서는 사용자가 직접 입력하기보다 목록에서 올바른 값을 선택하는 것이 가장 쉽습니다. 무엇보다도 DataGridViewComboBoxColumn을 사용하면 이 디자인을 가장 손쉽게 구현할 수 있습니다.
DataGridViewComboBoxColumn의 항목 목록은 ListBox에서처럼 항목 컬렉션을 사용하여 직접 추가할 수 있습니다. 또한 DataGridViewComboBoxColumn을 또 다른 데이터 원본에 바인딩할 수 있습니다. 이 경우 DataSource 속성을 사용하여 데이터 원본을 지정하고 DisplayMember 속성을 사용하여 열에 표시해야 하는 값을 나타내며 ValueMember 속성을 사용하여 기본 열 값에 사용해야 하는 값을 나타냅니다.
이에 대한 데모로 Products 테이블에 작업하는 다음 예제를 살펴보겠습니다. 이 테이블의 모든 레코드는 해당 CategoryID 필드를 통해 Categories 테이블의 레코드에 연결되어 있습니다. 제품의 범주를 변경하려면 사용자는 올바른 ID를 기억하여 CategoryID 필드에 입력해야 합니다. 보다 나은 방법은 Categories 테이블에 바인딩되는 DataGridViewComboBoxColumn을 사용하는 것입니다. 이 열은 CategoryName을 표시 멤버로 사용하지만 실제 기본 값으로 CategoryID를 갖게 됩니다. 또한 이 열은 DataProperyName 속성을 통해 Products 테이블에 계속 바인딩되어 사용자가 목록에서 새 Category를 선택하면 제품 레코드의 CategoryID 필드가 자동으로 변경됩니다.
다음은 이 테이블을 구성하는 데 필요한 코드입니다.
          ' 자동으로 생성된 CategoryID 열을 제거합니다.
          DataGridView1.Columns.Remove("CategoryID")
          
          ' CategoryID의 목록 열을 만듭니다.
          Dim List As New DataGridViewComboBoxColumn()
          List.DisplayIndex = 0
          List.HeaderText = "Category"
          
          ' 이 열은
          ' Products.CategoryID 필드에 바인딩됩니다.
          List.DataPropertyName = "CategoryID"
          
          ' Categories 테이블에서 목록을 채웁니다.
          List.DataSource = ds.Tables("Categories")
          List.DisplayMember = "CategoryName"
          List.ValueMember = "CategoryID"
          
          ' 열을 추가합니다.
          DataGridView1.Columns.Add(List)
          
          
결론
이 기사에서는 .NET에서 가장 기대되는 새로운 컨트롤 중 하나인 DataGridView의 개요를 설명했습니다. DataGrid와 달리 DataGridView는 데이터 바인딩 및 사용자 편집 시나리오와 정적 테스트의 표시와만 관련된 시나리오를 포함하여 다양한 실제 시나리오에서 올바르게 작동합니다. 머지 않아 .NET Framework가 설치된 통합 기능 데이터 솔루션이자 Windows Forms 개발자들이 .NET 2.0으로 업그레이드하려는 가장 큰 이유 중 하나인 DataGridView를 직접 경험할 수 있을 것입니다.

'닷넷 프레임워크' 카테고리의 다른 글

C# Thread 이야기  (0) 2009.09.22
Creating a splash screen  (0) 2009.07.15
MySQL 5.1과 C# 연동  (0) 2009.05.31
Thread 상태 전이도  (0) 2009.05.20
wav 파일 재생하기  (0) 2009.04.29

 

MySQL Server 5.1 설치편
http://ocplay.tistory.com/41

 

1. MySQL Connector/Net 6.0 다운로드

C#에서 MySQL을 사용하기 위해서는 Connecter driver가 필요하다. MySQL Connector/Net 6.0을 설치함으로써 닷넷 프레임워크에서 MySQL을 사용 할 수 있다.

다운로드 URL : http://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-6.0.3.zip/from/pick#mirrors

URL이 바뀌었을 경우 MySQL 홈페이지에서 다운 받으면 된다.

 

2. MySQL Connector/Net 6.0 설치하기


Next버튼을 누른다.

 


Complete 버튼을 누른다.

 


Install 버튼을 누른다.

 


설치중인 화면이다.


Finish버튼을 누르면 설치가 완료된다.

 

3. C#과 MySQL 연동 샘플 소스

사용환경 : Visual Studio 2005(C#)

새로운 콘솔 프로젝트를 생성한다. 그리고 MySQL.Data를 참조 추가한다.

 

 


using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace MySQL_Test
{

class Program
{

static void Main(string[] args)
{

string connStr = String.Format("server=localhost;user id=root; password=1339; database=test"); MySqlConnection conn = new MySqlConnection(connStr);
conn = new MySqlConnection(connStr); 

try
{

conn.Open();
Console.WriteLine("MySQL DB 연결");

}
catch { }
finally
{

conn.Close();
Console.WriteLine("MySQL DB 연결 닫기");  

}

}

}

}

 



결과
 

'닷넷 프레임워크' 카테고리의 다른 글

Creating a splash screen  (0) 2009.07.15
DataGridView 소개  (1) 2009.07.13
Thread 상태 전이도  (0) 2009.05.20
wav 파일 재생하기  (0) 2009.04.29
랜덤 파일명 생성하기  (1) 2009.04.29

'닷넷 프레임워크' 카테고리의 다른 글

DataGridView 소개  (1) 2009.07.13
MySQL 5.1과 C# 연동  (0) 2009.05.31
wav 파일 재생하기  (0) 2009.04.29
랜덤 파일명 생성하기  (1) 2009.04.29
txt 파일로 저장하기  (0) 2009.04.28
using System.Media;

string path = @"C:\WINDOWS\Media\chimes.wav";
SoundPlayer wp = new SoundPlayer(path);
//wp.PlaySync();
wp.Play();
Console.WriteLine("재생완료");
Console.ReadLine();


PlaySync() : wav파일을 동기화로 재생한다. 즉 wav파일이 재생이 완료되기 전까진 메소드가 block 상태다.
Play() : wav파일을 비동기화로 재생한다. wav파일을 thread를 이용하여 재생한다.

'닷넷 프레임워크' 카테고리의 다른 글

MySQL 5.1과 C# 연동  (0) 2009.05.31
Thread 상태 전이도  (0) 2009.05.20
랜덤 파일명 생성하기  (1) 2009.04.29
txt 파일로 저장하기  (0) 2009.04.28
정규식  (0) 2009.04.27


Using System.IO;

for (int i = 0; i < 10; i++)
{

string name = Path.GetRandomFileName();
Console.WriteLine(name);

}

 

여태껏 이걸 몰라 랜덤으로 문자열을 생성하고, 디렉토리 내에 파일 검색해서 중복되는 파일이 있는지 확인작업까지.. 역시 아는게 힘이다. 모르면 손발이 고생해. 위의 방법 대로 하면 중복되는 파일이 절대로 생성되지 않는다.

'닷넷 프레임워크' 카테고리의 다른 글

Thread 상태 전이도  (0) 2009.05.20
wav 파일 재생하기  (0) 2009.04.29
txt 파일로 저장하기  (0) 2009.04.28
정규식  (0) 2009.04.27
문자열 다루기  (0) 2009.04.27

using System.IO;

FileInfo fileinfo = new FileInfo(Application.ExecutablePath);
FileStream fs = new FileStream(fileinfo.Directory.FullName + @"\test.txt", FileMode.Append);

StreamWriter sw = new StreamWriter(fs, Encoding.Default);
sw.WriteLine("hello world!!");
sw.Close();

'닷넷 프레임워크' 카테고리의 다른 글

wav 파일 재생하기  (0) 2009.04.29
랜덤 파일명 생성하기  (1) 2009.04.29
정규식  (0) 2009.04.27
문자열 다루기  (0) 2009.04.27
String 형을 ascii 코드로 변환  (0) 2009.04.27

 

(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시
    
$ (dollar) : 라인의 끝이나 문자열의 끝을 표시
    
. (period) : 임의의 한 문자를 표시
예)
^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)


(2) [] (bracket) : 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타낸다.
[]내에서 "^"이 선행되면 not을 나타낸다.
이외에도 "문자클래스"를 포함하는 [:문자클래스:]의 형태가 있다. "문자클래스"에는 alpha, blank, cntrl, digit, graph, lower, print, space, uppper, xdigit가 있다.
이외에 [:<:]와 [:>:]는 어떤 단어(숫자, 알파벳, '_'로 구성됨)의 시작과 끝을 나타낸다.
예)
[abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일)
[Yy] (Y 또는 y)
[A-Za-z0-9] (모든 알파벳과 숫자)
[-A-Z]. ("-"(hyphen)과 모든 대문자)
[^a-z] (소문자 이외의 문자)
[^0-9] (숫자 이외의 문자)
[:alpha:] ([A-Za-z]와 동일)
[[:digit:]] ([0-9]와 동일)

(3) {} (brace) : {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄
예)
a{3} ('a'의 3번 반복인 aaa만 해당됨)
a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄)
a{3,5} (aaa, aaaa, aaaaa 만 해당됨)
ab{2,3} (abb와 abbb 만 해당됨)
[0-9]{2} (두 자리 숫자)
doc[7-9]{2} (doc77, doc87, doc97 등이 해당)
[^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당)
.{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당)

(4) * (asterisk) : "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열
예)
ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등)
* (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨)
.* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨)
ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등)
a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등) doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당)
[A-Z].* (대문자로만 이루어진 문자열)
like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이됨, like, likely, liker, likelihood 등)

(5) + (asterisk) : "+" 직전의 선행문자가 1번 이상 나타나는 문자열
예)
ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨)
ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등)
like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨)
[A-Z]+ (대문자로만 이루어진 문자열)

(6) ? (asterisk) : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열
예)
ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)

(7) () (parenthesis) : ()는 정규식내에서 패턴을 그룹화 할 때 사용

(8) | (bar) : or를 나타냄
예)
a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함)
yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함)
korea|japan|chinese (korea, japan, chinese 중 하나)

정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함

 

http://bequietzero.springnote.com/

 

 

이 글은 스프링노트에서 작성되었습니다.

'닷넷 프레임워크' 카테고리의 다른 글

랜덤 파일명 생성하기  (1) 2009.04.29
txt 파일로 저장하기  (0) 2009.04.28
문자열 다루기  (0) 2009.04.27
String 형을 ascii 코드로 변환  (0) 2009.04.27
is 비교 연산자, as 연산자  (0) 2009.04.27

+ Recent posts