C#에서는 몇몇 클래스를 통하여 간단히 작성할 수가 있다.

그 예제 코드는 다음과 같다. (MSDN에서 발췌 해 왔다. 보면 -_-;; 알 사람들은 다 알 듯..)

[예제]

        private const String filename = "Test.xml";
        private const String stylesheet = "myStyleSheet.xsl";

            XslTransform xslt = new XslTransform();
            xslt.Load(stylesheet);
            XPathDocument xpathdocument = new XPathDocument(filename);
            XmlTextWriter writer = new XmlTextWriter("testResult1.xml", Encoding.UTF8);
            writer.Formatting = Formatting.Indented;
            xslt.Transform(xpathdocument, null, writer, null);

여기서 보면 xslTransform을 생성하고 해당 xsl 파일을 로드한다.

물론 이것은 사용자가 정의를 해 줘야한다.

필자가 테스트한 myStyleSheet.xsl의 내용은 다음과 같다.

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="Students/Student">
<name><xsl:value-of select="Name"></xsl:value-of></name>
<value><xsl:value-of select="Value"></xsl:value-of></value>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Test.xml의 내용은 다음과 같다.

<?xml version="1.0" encoding="utf-8"?>
<Students>
<Student>
<Name>test</Name>
<Value>10</Value>
</Student>
</Students>

이것을 실행하여 새로운 파일을 생성한다면 그 안의 내용은

<name>test</name>
<value>10</value>

로 저장이 된다.

이를 통하여 새로운 데이터들을 정의하여 원하는 방식으로 뽑아 쓸 수 있다.

MSDN은 역시 보물 창고다!! ㅠ_ㅠ

무턱대고 네이버나 이런데서 찾는 사람들이 없기를 바라며..


흠.. 일반적으로 닷넷에서 정해진 폼이 있다. 하지만 원하는 메세지들 내용 등을 바꾸자면 아래 예제 코드와 같이 가능하다.

*예제 코드*

public class MessageBoxChange
    {
        delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr SetWindowsHookEx(int hook, HookProc callback, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern IntPtr GetDlgItem(IntPtr hDlg, DialogResult nIDDlgItem);

        [DllImport("user32.dll")]
        static extern bool SetDlgItemText(IntPtr hDlg, DialogResult nIDDlgItem, string lpString);

        [DllImport("kernel32.dll")]
        static extern uint GetCurrentThreadId();

        static IntPtr g_hHook;

         string yes;
         string no;

        //OK
        public DialogResult Show(string text, string caption, string ok)
        {
            this.yes = yes;
            this.no = no;
            g_hHook = SetWindowsHookEx(5, new HookProc(HookWndProc), IntPtr.Zero, GetCurrentThreadId());
            return MessageBox.Show(text, caption, MessageBoxButtons.OK, MessageBoxIcon.Question);
        }

        //YES NO
        public DialogResult Show(string text, string caption, string yes, string no)
        {
            this.yes = yes;
            this.no = no;
            g_hHook = SetWindowsHookEx(5, new HookProc(HookWndProc), IntPtr.Zero, GetCurrentThreadId());
            return MessageBox.Show(text, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        }

        public int HookWndProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            IntPtr hChildWnd;

            if (nCode == 5)
            {
                hChildWnd = wParam;

                if (GetDlgItem(hChildWnd, DialogResult.OK) != null)
                    SetDlgItemText(hChildWnd, DialogResult.OK, this.yes);

                if (GetDlgItem(hChildWnd, DialogResult.Yes) != null)
                    SetDlgItemText(hChildWnd, DialogResult.Yes, this.yes);

                if (GetDlgItem(hChildWnd, DialogResult.No) != null)
                    SetDlgItemText(hChildWnd, DialogResult.No, this.no);

                UnhookWindowsHookEx(g_hHook);
            }
            else
                CallNextHookEx(g_hHook, nCode, wParam, lParam);

            return 0;
        }
    }

당연히 주의해야할 점은 네임스페이스다.

이들은 Forms를 참조하는 다이얼로그와 P-INVOKE를 이용하기 위한 InteropServices 의 네임스페이스를 참조해야한다.

이를 꼭 명심하자!!

1. BackgroundWorker는 ComponentModel 네임스페이스를 이용해야 쓸 수 있다.

2. BackgroundWorker bw = new BackgroundWorker(); 로 생성한다.

3. bw.WorkerSupportsCancellation = true; 설정을 해 준다.

4. bw.DoWork += new DoWorkEventHandler(bw_DoWork); 의 이벤트 핸들러를 생성한다.

5. bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);의 이벤트 핸들러를 생성한다.

6. DoWork 내부에 쓰레드에 이용할 내용을 첨부한다.

7. RunWorkerCompleted 내부에 쓰레드 종료시 이용할 내용을 첨부한다.

if (e.Error != null){} 에러 발생 시 처리
else if (e.Cancelled){bw.CancelAsync();}사용자에 의해 종료 되었을 시 처리
else{}정상 종료 되었을 시 처리

물론 이 BackgroundWorker를 실행하기 위해서는 bw.RunWorkerAnsync(); 처리를 해 줘야한다.

게시글 중 하나 이와 유사한 글이 있다. 그 부분은 단시 쓰는 방법에 대한 것만 나와있다.

쓰레드가 완료 된 처리 내용에 대한 것은 없는 껍데기에 불과 하다는 이야기다.

앞으로 좀 더 잘 알아보고 블로깅을 해야지.. ㅠ_ㅠ 이거 원..
[C#]ComboBox 자동 완성! C# 2009. 6. 12. 14:37

흔히들 검색하다보면 한글자 치면 주르륵 내용이 나온다

그와 같이 콤보 박스도 가능하다.

물론 텍스트 박스도 TextChange 이벤트를 이용하여 가능하다.

하지만 데이터베이스와 연결이 되어있어야한다는 치명적인.. 약점이 ...

절차는 다음과 같다

1. AutoCompleteCustomSource에 컬렉션을 등록한다.

2. AutoCompleteMode에서 원하는 성격의 방식을 선택한다. 3가지 방식이 있다.

3. AutoCompleteSource에서 CustomSource를 선택한다.

그렇게 하면!! 된다!!

프레임워크 상에서 편하게 제공해주니.. -_- 그저 감사할 뿐이다 ㅎㅎ
[C#]Indexer ?? -_-;; C# 2009. 6. 10. 17:49
이거.. 좀 망설였다 -_-;;

왜!! 객체를 생성해 두고 -_- 왜!! .....

그놈의 배열을 이용하는 것인가 하고!!

뭐.. 이유야 있겠지만..

객체에 대한 생성을 하고 한다는게 조금 희안하기는 했다.

일단 먼저

class IndexClass<T>
{
   string[] T= new string[10];
}

라는 Index를 위한 클래스를 둔다

보통 우리는 객체를 생성해서 obj.indexArray로 접근한다!! 단!! public 일 때만 가능한 일이다.

하지만 private로 접근 한정자가 붙는다면.. 이 방법을 써야한다.

그래서 이 것을 쓰는가 보다!!

public T this[int i]
    {
        get
        {
            return indexArray [i];
        }
        set
        {
            indexArray [i] = value;
        }
    }

이 부분이 Index 클래스에 포함된다면!!

IndexClass<string> index = new IndexClass<string>();
index[0] = "인덱스를 통한 배열 접근";

이렇게 값을 할당 할 수도 있고

Console.WriteLine(index[0]);

해서 이용 할 수도 있다!!

필자는 제네릭을 이용해서 예제를 나타낸 것이지만..

그냥 이용하는 타입인 string으로 처리해서 한다해도!!

가능합니다~ ^_^
Hashtable.. 이놈을 당연히 모든 개발자들을 알 것이죠.

-_- 근데.. 이놈을 출력할때는 랜덤입니다..

1,2,3,4 로 넣었다고 할 경우

1 3 2 4 라던지 경우의 수대로 막 -_-..

그런게 싫다면 sortedList 를 이용하면 좋죠

정해진 기준에 순차적으로~ 슈슉~ 나오지만.. -_- 네.. 무겁습니다.. 것도 아주 제대로 -_-

Hashtable을 이용하면 key와 value 값을 구분해서 쉽게 이용되죠

Hashtable table = new Hashtable();
table.add(key,value);

이런 식으로 쓰면 됩니다.

물론 key와 value에 정해진 타입은 없습니다.

쓰시고 싶은 형태로 정의하시면 됩니다.!!

가장 기초적이라 할 수도 있는 컬렉션이지만..

다시 한번 돌아보면 좋겠죠?^_^/

TripleDES를 이용하여 C#에서는 손쉽게!! 암호화를 한다.

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

하지만 -_- 이놈에 대해서 한번이라도 생각해 본 적 있는가?

생성할때마다 Key와 IV 의 값이 달라진다.

그래서 생각해 낸것이!!

File.WriteAllBytes(경로,Key 또는 IV)를 이용하여 파일로 빼둔다!!

그리고 난다음 복호화 할때 저 파일을 File.ReadAllBytes(경로)를 해서 해 놓으면!!

APP 개발에 도움이 많이 될 것이다!! 라고 필자는 생각한다 ^_^/

우힛~ -_-;
C#에는 TCP방식에 헬퍼 클래스를 이용할 수도 있고

Socket을 열어서 적용 시켜줄 수도 있다.

그럼 여기서 각각의 NetworkStream을 받아서 적용하는 법을 알아보자

1. Socket

Socket server=null;
Socket client=null;
...
이렇게 정의 되어 있다고 한다면
server 소켓에 연결된 것을 client에 바인딩 해 준다
client = server.Accept();

이렇게 하면 연결이 된 것이다

하면 NetworkStream은 어떻게 쓰느냐?
NetworkStream ns = new NetworkStream(client);
를 해 주면 ns에 대해서 확보를 한다.

SreamWriter나 StreamReader를 이용할 경우 new 스트림 종류(ns) 를 해 주면 적용이 된다.

2. 헬퍼 클래스

TCPListener 를 통하여 연결되었다고 할 경우에

NetworkStream ns =null;

상태에서

ns = client.getStream();

처리를 해 준다음

SreamWriter나 StreamReader를 이용할 경우 new 스트림 종류(ns) 를 해 주면 적용이 된다.

간단하지만.. 약간의 차이점이랄까?
솔직히.. -_- 이거 땀시.. 머리 좀 많이 굴렸다..

왜? -_- 스레드의 생명 주기와 같이 끝나는 시점을.. 몰랐기에..

그냥 MSDN 볼걸... ㅠ_ㅠ

브레이크 포인트 찍어서 정확하게 알아낸게 어딘지.. ㅠ_ㅠ

일단 Stream을 통해서 ReadLine()을 한 것은 바로 제어권이 넘어간다

하지만!!

ReadToEnd()한 것은.. -_-

해당 Stream이 닫혀야지만.. 그 제어권이 넘어갔다..

필자는.. -_- 솔직히 이 두개 똑같은 형식일거라 생각하고 아무 생각없이..

-_- 뭐지.. 하면서 여러 수십번 실행을 해 봤다..

테스트 해 보실 분은 FileStream을 열어서 각각 ReadLine()과 ReadToEnd()

두가지를 적용해 보시면 금방 알아채실 것이다..

-_- 아 글고 딱 보면 알 것이다.

ReadLine()은 한줄 한줄 불러들이지만!!

ReadToEnd()는.. -_- 끝까지~ 다 긁어온다!!
[C#]일본어 인코딩 C# 2009. 4. 7. 18:28
Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");

처리를 한 후 당겨 쓰면 된다 -_-a

DllImport를 오랜만에 하면서 이래저래 손댔더니 -_-;;

기억 저 멀리에서 -_-..

반갑게 맞이하네;;