'C#/일반적인코딩'에 해당되는 글 4건

  1. 2008.12.29 :: ListView에서 Drag & Drop
  2. 2008.11.22 :: C#의 Setting Class
  3. 2008.11.21 :: 시리얼 장비 통신에 대한 짧은 이야기
  4. 2008.11.14 :: 폼안의 컨트롤을 foreach로 돌리는법 2
C#/일반적인코딩 2008. 12. 29. 00:02

리스트 뷰에서 드래그 드랍을.. 하려고 한다.

 

http://blog.naver.com/pino93?Redirect=Log&logNo=30009078322

 

이 글에 보면 리스트뷰에서 드래그 드랍을 설명하는데 문제는 스트링을 값을 넘기도록 한다는것이다.

 

윈도우의 객체들은 아니.. 뭐냐 여러가지 컨트롤들은 객체단위로 쪼갤수 있는 개념을 가지고 구조를 가지고 있다.

예를 들어서 TreeView의 경우 TreeView는 실제적인 표현만 할뿐 우리가 사용할것은 TreeNode 란 각 개체가 주가 된다.

 

마찬가지로 ListView의 경우에도 ListViewItem 이 주가되도록 되어 있다는 것이다.

그러니까 결국 넘길때도 당연히 리스트뷰가 주가 아닌 아이템을 넘겨야 한다는 이야기다.

아마도 이런 컨트롤이 닷넷 2.0이후에 나왔다면.. list<ListViewItem> 같은 컬랙션을 가지지 않았을까 짐작을 하지만 대략의 버전들이 이전에 만들어진 상태에서 변경자체를 두려워 할수 밖에 없다면 어쩔수 없이 그때의 가지고 있는 자체 컬랙션에 담겨있게되는것이다.

ListViewItemCollection도 아닌 ListView.SelectedListViewItemCollection 이란곳에 담겨져 있다. 나중에 클래스내부를 한번 열어보고 싶은데 listview의 내부에 다시금 컬랙션을 선언해서 이렇게 한 이유가 있겠지만 하여간 이전버전에 컨트롤을 만들면서 왜 이럴수 밖에 없었는지 매우 궁금하다. 아마도 요즘에 만들었다면 IEnum쪽으로 Item들의 select 특성을 뒤져서 List<> 컬랙션에 넣어서 반환하지 않았을까 하는 짐작을 하지만 옛날에는 나름 셀렉션? 적인 문제가 있었거나 그런문제들을 복합적으로 해결하기 위해서 개체가 따로 있는 방식이 아닌 Livew의 내부클래스로 선언해서 처리하지 않았나 하고 짐작해본다. 새롭게 만들면 이것도 GridView가 DataGridView 처럼 바뀌어야 될테니.. 하여간 아마도 그럴일은 없겠지만..

 

드레그 드랍시도 이것을 넘겨줘야 한다. 왜냐면 우리가 선택한 아이템은 하나가 아니고 여러개일수 있기 때문이다.

그래서 넘겨주는 곳에는 마우스 다운이나 또는 마우스 무브에...(일반적으로 다운에 서술한다. 왜냐면..불필요한 코딩을 처리하지 않기 위해서이다.)

   1: private void listView1_MouseDown(object sender, MouseEventArgs e)
   2: {
   3:     DragDropEffects effect;          
   4:     effect = this.DoDragDrop((sender as ListView).SelectedItems, DragDropEffects.Copy);
   5: }
 

이런식의 삽입처리를 해주고

 

이것을 받는곳에는..다소황당하겠지만 이미 설명했듯이 이전버전의 닷넷에서 가질수 없는 컬랙션을 자체적으로 가지기 위해서는 어쩔수 없었다고 이해하는것이 맞다고 본다.

 

   1: private void listView2_DragDrop(object sender, DragEventArgs e)
   2: {
   3:     ListView.SelectedListViewItemCollection lvCollection = 
   4:         (ListView.SelectedListViewItemCollection)e.Data.GetData(typeof(ListView.SelectedListViewItemCollection));
   5:  
   6:     foreach (ListViewItem item in lvCollection) listView2.Items.Add(item);
   7: }

 

이런식의 삽입이 이루어 져야한다.

황당한 캐스팅으로 값을 가져오지만.. 이렇게 처리함으로 인해서 정상적으로 선택한 리스트뷰의 값들을 가져와서

쉽게 추가할수 있는것이다.

'C# > 일반적인코딩' 카테고리의 다른 글

C#의 Setting Class  (0) 2008.11.22
시리얼 장비 통신에 대한 짧은 이야기  (0) 2008.11.21
폼안의 컨트롤을 foreach로 돌리는법  (2) 2008.11.14
posted by 삶의여유로움
:
C#/일반적인코딩 2008. 11. 22. 21:34

이글을 적는 이유는..

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=100533&ref=100533&page=2

전적으로 이글때문이다.

이글을 적으신분의 성함이 내가 아는분과 같기때문이다.

왠지.. 답을줘야 될것같은.. 막연한.. 의무감 같은거 말이다.

일단 커피한잔 때리고 와서 더 적자..

 

시작하면서..

우리의 아련한 기억속에..

WritePrivateProfileString / GetPrivateProfileString

이녀석들의 API가 남아 있는지 모르겠다. 뭐 나야 한번도 사용을 안해본거라서 저게 당최 뭔지 모른다만 아시는분들이 보시면.. 흐~ 하고 미소를 지을듯 싶다.

 

GetPrivateProfileString("거시기", "어라시구", "뭐니", "xxx.ini") 같은 이상한것들을 적어두고.. 제일뒤에 xxx.ini만 있으면..

그 프로그램마다 ini를 만들고 저장하던게 아니였나 싶다. 상세한건 당근 생략이다.

지금에 와서 저걸 사용하는 사람들도 거의 없기도 하거니와 요즘은. XML이란 요물단지덕분에 세상이 많이 변했기 때문이다.

캬~~ 또 예제를 만들어야 하다니.. 안습이다.

 

심심풀이로 콘솔을 만들어보도록 하자..

clip_image001

어디에도 셋팅이 보이지 않는다.

clip_image002

조금 보일까 말까한다.

clip_image003

흐흐..

clip_image004

그렇다.. 이건 뭐 너무 쉬운이야기들이라서.. 모르는사람이 거의 없을 수준이라고 본다만..

그래도 일일이 그림으로 적어본다.

clip_image005

 

저걸 눌러서 MSDN을 보길 바란다.

 

거기에 상세히 읽어보면 된다.

자.. 내가 글을 적으면 뭐하겠냐.. 얼른.. 빠르게 넘어가자.

횡설수설만 늘어날뿐..

개념도 쉬우니 금방 이해될것이다.

기본활용중 하나..

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1576&page=1

이렇듯 다들 잘 사용하는것에 대해서 굳이 내가 적을글이 뭐가 있을까.?

그렇다. 그러니 링크들로 이야기를 대신하자.

http://csharp-projects.blogspot.com/2008/01/windows-forms-user-settings-in-c.html

이글을 읽게되면.. 즉 INI의 대용적인 프로그램의 시작위치와 폼의 크기를 다시 셋팅하는것을 이야기 한다.

아.. 혹시나. 질문을 할까봐 미리 대답의 링크를 적어두자면

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=99697&ref=99672

셋팅된 xml파일은 여기에 저장이 된다.

Msdn의 글

http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx

 

//-------------------------------------------------------------------------------------------------------

 

자 이제부터 내이야기를 적어보자..

뭐 이미 저정도 풀었으니 알만큼 알았을테고… 하지만..안습이게도 영어거부증과

몇몇 아티클을 대충읽는 이들이 많으니 어쩔수 없이 그들을 낚기 위해서는 뭔가 있어보이는걸 뿌려야 한다는것이다.

 

참.. 안습이다.

그러나 이미 콘솔로 시작했으니 뭐.. 낚을게 별로 없다.

하여간.. 기본적으로 어풀리케이션의 값을 저장해서 다시 시작할때 다시 그값을 자동적으로 셋팅해서 사용할수 있다는것이 핵심이다.

그것을 위해서 가볍게 음… 어떤 예제가 좋을까 음………………

콘솔이다 보니 쉽게 이런것을 예제로 하자 당신이 프로그램을 종료할때의 시간을 기록해서

다시 시작할때 보여주는것이다.

(예제로는 정말. 별로이긴 하다 ㅠ.ㅠ)

 

 

자 코딩을 해보자.

clip_image006

clip_image007

clip_image008

자.. 이렇게 될것이다.

이제 우리는 저장루틴을.. 또 첨부하자.

저장은.. 뭐 어려운게 없다.

clip_image009

자 시간을 비교해 봐라..

몇십초 차이가 나지 않는가?

static void Main(string[] args)

{

Console.WriteLine("현재시간은 : " + DateTime.Now.ToString());

Console.WriteLine("당신의 마지막 로긴시간은 : " + Settings.Default.LonginTime.ToString());

Settings.Default.LonginTime = DateTime.Now;

Settings.Default.Save();

}

 

//-----------------------------------------------

 

이렇게 간단하게 값을 저장하는것이 가능하다.

Save란 호출 하나로 말이다.

당연히 자동으로 불러와서 셋팅까지 되니 예전의 INI에 비하면.. 천국이 아닐수 없다.

여기서.. 바로 다음과정으로 가도 되겠지만 게으른 당신을위해서 저것이 저장되는 모습을 살짝이 살펴보자.

clip_image010

실제적인 저장은.. 이렇게 된다.

XML인 것이다.

그렇다. 당연히 이런것은 당신에게 무지 익숙할것이고 이정도라면.. 당연히 DataSet같은건 말밥으로 들어갈꺼란 이야기다. 그러나 질문자의 의도는 무엇이였나?

그렇다. 그넘의 해쉬~ 테이블이였다.

clip_image011

 

위의 글을 상세히 보면.. Serialize가. AS.. 즉. String이란거다. 만약 데이터 테이블같은걸 넣었다면.. XML 이라고 될것이다.

그럼.. 해쉬는 안될까?

일단은.. 이 클래스를 살펴봐야겠다.

clip_image012

우리가 셋팅이란 클래스를 만들게 되면.. 위에 그림으로 설명한.

clip_image003[1]

이걸 누르게 되면..

위의 솔류션에 Setting이란.. CS파일이 생긴다. 저 파일을 보면.

clip_image013

대충.. 이런게 생성이 된다.

 

요걸 잘 조물딱 거리면.. 우리는 이 난국을 해쳐 나갈수도 있을것이다.

 

그러기 위한 테스트를 하나 더 만들어야 겠다.

clip_image014

요렇게 만들면..

clip_image015

요렇게 만들어 질것이다.

일단은.. 시도를 해보자.

clip_image016

 

이런.. 안된다. 역쉬다.

clip_image017

코드야.. 뻔한 이야기고..

안된다는 것이다.

 

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

[SerializableAttribute]

[ComVisibleAttribute(true)]

public class Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable

처음에 해쉬테이블의 ISerializable, IDeserializationCallback, 라고 적힌걸 못 보았다.

덕분에 이걸 만들어야 하나.. 졸라 짜증이 밀려왔더랬다.

두번째 보니 이게 보이더라는..

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

 

그러나.. 포기를 하면되겠는가.. 안되는거 알지만 한번더 해보자.

clip_image018

스트링도 안된다.

막판이다.. 그렇다. 바이너리 함 찍어보자.

clip_image019

졸 삽질이다.

그렇다. 된다.

clip_image020

 

//-----------------------------------------------------

 

[SerializableAttribute]

[ComVisibleAttribute(true)]

public class Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable

 

IXmlSerializable 는 XML로.. 구현을 뽑고

Iserialiable는 Binary로 뽑아서 사용하자.

 

상세한 설명은.

http://msdn.microsoft.com/ko-kr/library/system.configuration.settingsserializeasattribute.settingsserializeasattribute.aspx

 

 

 

 

posted by 삶의여유로움
:
C#/일반적인코딩 2008. 11. 21. 00:34

Serial에 대한 볼거없는 MSDN

http://msdn.microsoft.com/ko-kr/library/system.io.ports.serialport.aspx

Serial에 대한 반드시 읽어봐야 하는 문서

http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort-_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx

크로스쓰레드에 대한 MSDN

http://msdn.microsoft.com/ko-kr/library/ms171728(VS.80).aspx

 

 

세상에는 나처럼 든거없이 떠드는 빈깡통이 있는반면

항상진중하게 자기 할것만 하고 다른이가 정리한것만 보는 착실한 친구들이 있다.

누가 옳고 그른것들은 없다. 세상의 구성원이란게 원래 그런거니까. 그렇게 그렇게 무엇인가가 조화롭게 이루어져 나가는것이 좋은것이라 생각한다.

두개체가 적정비율이 되는것이 가장 중요한것 같다. 비율이 한쪽으로 쏠린다면 결국 서로 좋은게 없지 않을까 한다.

 

상상은 스스로 하기로 하고

지금부터 떠들 깡통의 소리는..

시리얼에 대한것이다. 정말 쉽다.

별게 없다.

 

이글은 단지 심풀하게 시리얼에서 데이터를 받는것을 보여주고자 한다.

왜냐면 내가 해야되는일중에 하나가 전화가 오면 그 전화번호를 화면에서 보여주는데 검색을 통해서 누가 전화를 한지 알려주기 위한것이기 때문이다.

clip_image001

아주 간단하게.. 코딩이 완료되었다.

하지만.. 여기서..

에러를 발견하게 될것인데.

clip_image002

이런에러가 발생될것이다.

이건.. 너무나도 일반적인 이야기 임에도 아직도 질문을 하는 인간들이 많으니.. 상세~~~ 하게 이야기 해보자.

clip_image003

아마도 2.0부터 이렇게 되고.. 그 하위버전에서 처리한다면.. 델리게이트를 외부에서 선언해주고 함수또한 외부에 넣어주고.

구문내에서는.. 호출함수를 적어주면 될것이다.(물론 하위버전에서는 저런 오류가 나오지 않는다.)

굳이 이렇게 귀찮게 코딩을 하는것은 폼클래스에서 돌고있는 쓰레드와

우리가 생성한 시리얼포트에서 처리되는 쓰레드가 말그대로 교차되기 때문이다.

그럴때 교차의 순서를 정해주는 입장이라고 생각하면 되는데…. 즉.. 시리얼에서 데이터를 받아서 그것을 택스트박스에 뿌려주는것을

폼쓰레드의 this.Invoke는 폼의 함수호출을 의미한다.

거기내에서 실제 실행되어야 하는것을 넣어주는것이다.

clip_image004

clip_image005

물론… 폼쓰레드에 넣는게 황당하다고 생각된다면..

clip_image006

이런식으로 textBox의 쓰레드에 넣어도 된다..

여전히 뭔말인지 모르겠다면..

clip_image007

이렇게 만든 아주 간단한.. 폼 파일인데…

이녀석의 쓰레드 개수는

clip_image008

clip_image009

이렇게 15개나 된다. 그냥.. 폼만 만들면.. 대략 9개던가?의 쓰레드가 돌아가는데..

하여간.. 심풀한 폼에도.. 이렇게 쓰레드가 많이 돈다는 이야기다.

그러니 그 녀석들간의 충돌이 문제가 없게 하기위해서는 서로간의 일종의 동기화가 맞아야 하는것이고

 

동기화를 맞춰 주기위해서 저렇게 처리해주는것이다. 물론.. 무식하게.. 동기화고 뭐고

내맘이다 할때는 그럴때를 위해서.. MS이런것도 만들어 두었다.

clip_image010

     

 

using System.IO.Ports;

 

namespace WindowsApplication9

{

    public partial class Form1 : Form

    {

 

        SerialPort port = new SerialPort("COM3", 19200, Parity.None, 8, StopBits.One);

 

        public Form1()

        {

            InitializeComponent();

            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            port.Open();

            CheckForIllegalCrossThreadCalls = false;

        }

 

        void port_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            textBox1.Text += port.ReadExisting();

        }

 

    }

}

 

 

참고로.. 포트 COM3라고 적은것처럼.. 저것과 속도 19200<--- 등등은 장비에 따라 다르니 저게 틀린다면..

들어오는 정보는.. 잡음이라고 생각해야 할것이다.

 

 

위의 크로스 쓰레드에 대한이야기는 네트웍의 채팅프로그램같은것을 만들때도 반드시 알아야 하니..

꼭 숙지(?)고 뭐고 이미 다 알고 있을거라 믿는다.

 

귀차니즘을 무릎쓰고…

image

내부에서 함수로 처리되지 않고 실제적인 델리게이트의 모습으로 이쁘게 처리된다면… 요렇게 해야겠지.

'C# > 일반적인코딩' 카테고리의 다른 글

ListView에서 Drag &amp; Drop  (0) 2008.12.29
C#의 Setting Class  (0) 2008.11.22
폼안의 컨트롤을 foreach로 돌리는법  (2) 2008.11.14
posted by 삶의여유로움
:
C#/일반적인코딩 2008. 11. 14. 21:58

     

    이 글을 적은지도 꽤 지났는데 어느날..

    http://mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=25&ID=322

    이글을 봤다.

    흐흐.. 저기 적혀 있는게 더 나은 루틴이다.

     

    모양이 똑같다 그런데 흐흐 잠시 흠칫 놀랐더랬다.

    뭐 그리 똑같지는 않다만..

     

    실제 업무에서 쓸때는 DB쪽 강좌에 적은 Reflection을 이용한것을 사용해 보길 권한다.

    개인적으로 루틴돌리기에는 그것도 나쁘지 않은듯 보여진다.

    우째도 내가 저 링크보다 좀 더 아는척 해보고 싶다. ㅋㅋㅋ

    사실 아는건 쥐뿔도 없다는 다들 알꺼고..

     

    개인적으로 저 사이트 참 괜찮다. 공부할게 많으니 들러서 모든 글을 싸그리 다 읽어버리길 권한다.

     

    내가 적은 여기 블러그는 저 사이트에 비하면.. 조족지혈이다.

     

    휠씬 더 나은방법을 사용하고 있으니 잘.. 참고하길 바란다.

     

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

     

    참 부족한 프로그래머로서 남의코드에 이러쿵 저러쿵 할말은 없으나

    그래도 항상 하는짓이 꼭 남의코드 수정이나 해야되는 입장에서

    되도록 그분들의 코드가 잘~ 작성되었으면 하는 바램이 있다.

    http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=97314&ref=97314&page=1

    이글을 읽다가 문득 마음이 아파왔다.

    일전에 약 70여개의 컨트롤들의 탭이나 입력값을 제어하는 코드를 수정해 줘야했는데

    그 코드가 마치 하나하나 대입하거나 IF문을 사용했던것이

    수정을 위해서도 어찌그리나 피곤하던지 말이다.

    믿어지지않겠지만 35번째를 수정하면 그 이하 코드를 다 수정해야 되도록 코딩을 해 두셨다.

    게다가 폼만.. 30개쯤 되었으니.. 어림잡아.. 300여개정도.. 코딩으로 1000줄은 수정해 줘야했던듯 했다.

    참 마음아프게도 이 코드를 수정을 해줘야 겠는데 다 지우고 그냥 몇줄 적으면 되는것을

    지워야 하나 아님 새로 만들어야 하나를 두고 고민했었다.

    지우자니 굴러온돌(?) 박힌돌의 코드를 맘대로 수정했다고 욕먹을듯 눈치는 보이고

    그렇다고 양해를 구해보니 절대 수정하지 말라는 황당한 요청은 들어오고

    그렇다고 이걸 수정하자니 너무 많은 수정이 있었다.

    일단 기초적 방법은 두가지가 있다.

    하나는 Collection에서 foreach를 이용하는것이고

    두번째로는

    그 응용으로 컬랙션의 값을 다시금 컬랙션으로 만드는것이다.

    전자의 방법은 collection내부에 다시금 collection이 포함된경우 그 내부의 컬랙션안에 들어간것을 처리할수가 없다.

    이말 조차 이해를 못하는 사람들이 있을까봐 다시금 풀어서 이야기하자면

    폼은 하나의 컬랙션개체이고 그룹박스, 패널, 탭컨트롤 등등도 컬랙션 개체이다.

    즉 잘 풀어서 이야기 하면 폼에 라벨을 두고 그룹박스 않에 라벨을 두면

    두개의 개체에 있는 라벨을 foreach로 모두 처리하기에는 피곤하다는 이야기다.

    그래서 즉.. 두번째 방법을 사용하게 된다.

    미래에 내가 또 어느곳에 가서 코드를 수정해 주고 있을지 모르나

    그분들의 코드가 조금은 수정하기 쉽게 만들어지길 바라는 조그만 소망으로 이글을 적어본다.

    clip_image001

    그림은 일반적으로 쉽게 볼수 있는 형태이다.

    여기서 좌측에 있는 label1,2,3에대가 1,2,3을 대입해 보도록 하자.

    그러기 위해서 저 라벨을 포함한 컬랙션에서 끄집에 내면 될것이다.

    foreach (Control x in this.Controls )

    처럼 적게되면.. 폼에 포함된 모든 컨트롤을 가져오게 된다.

    예를 들어서

    clip_image002

    이런 코드를 작성했다고 하자.

    그럼..

    clip_image003

    이런 화면이 나타날것이다.

    여기서 그룹박스에 숫자 "2"가 나오는것을 유심히 보고

    또한 그룹박스 이내에 있는것들은 아무런 변화가 없는것을

    확실히 인지하기 바란다.

    자.. 일단은 뭔가 될것 같기는 하다. 그럼 여기서 우리가 원하는 라벨에만 숫자를 생성시켜야 한다는것이 두번째 과제일것이다.

    그것은 어떻게 해야할까? 그것도 그리 어렵지 않다. 그 컨트롤이 단지 라벨인가만 확인해주면 되는것이다.

    clip_image004

    clip_image005

    여기까지 해줬음에도 불구하고 또 질문이 들어온다.

    난 위에서 부터 1,2,3을 처리하고 싶은데 어떻게 해야하냐고

    i--처럼 역순으로 해야하나고 말이다.

    이글의 앞에 컬랙션이라고 이야기 했듯이

    이 컬랙션들은 ADD형태로 내부에 사용되는 녀석들을 대입해줘야 한다.

    그 대입의 순서에 따라서 위와 같은 형태가 나타나게 되는것이다.

    clip_image006

    디자이너에 가서.. 컬랙션 대입하는곳을 찾아보자.

    clip_image007

    자 보이듯이 라벨1이 가장 늦게 들어가니 순서가 늦게 되는것이다.

    이 순서를 원하는데로 변경해 두자.

    사용하는 ADD 이런매서드로 말이다.

    clip_image008

    자 이제.. Foreach의 설명을 마칠까 한다.

    Foreach로 그룹박스안에것도 돌리기 위해서 다시금 foreach안에 또 foreach구분을 넣어서 그룹박스일때 돌려야 할것이다.

    뭐.. 그렇게 한들 어떻다고 생각한다면.. 어쩔수 없다.

    나야.. 그렇게 작성된 소스 수정한다고 또 고생길이 열리는수 밖에..

    윈폼프로그램에 빠질수 없는것이 있다면 위와같은 폼에서 입력후

    모든 입력값을 지워야 하는것이다.

    초기화란 어디가나 꼭 있어야 하는것이니 모두들 동감하리라 믿는다.

    위의 예제에서 보듯이 그룹박스내에 포함된 택스트 박스는 foreach만으로는 초기화가 되지 않을것이다.

    그럼 어떻게 해야 하는가? 바로 그 두번째 방법을 사용해야될것같다.

    뭐 대단한 방법이라고 기것해봐야 재귀호출일뿐인데 말이다.

    코드는 두어줄이라서 설명할것이 없다만

    그래도 모르겠다면 질답란에 적어두면 누군가 상세히 설명을 해줄것이다.

    함수는 이것이고

    private void getControls(Control.ControlCollection Ocontrol, ref ArrayList Space)

    {

    for (int i = 0; i < Ocontrol.Count; i++)

    {

    Space.Add(Ocontrol[i]);

    if (Ocontrol[i].Controls.Count > 0) getControls(Ocontrol[i].Controls, ref Space);

    }

    }

    호출은 이렇게 하자.

    ArrayList AL = new ArrayList();

    getControls(this.Controls , ref AL);

    for (int i = 0; i < AL.Count; i++)

    {

    if (AL[i] is TextBox)

    ((Control)AL[i]).Text = "초기화";

    }

    자 이렇게 하면 결과는..?

    clip_image009

    그룹박스 안에 있는것까지 깔끔하게 처리가 된다.

    이럼에도 시비(?)를 거는 친구들이 가끔 있을듯 해서

    조금 더 복잡하게 만들어서 테스트를 해보자.

    clip_image010

    아주 가볍게 처리가 되지 않는가?

    폼에.. 탭에.. 패널에 그룹박스에 다시 그룹박스에 탭에 등등

    을 해도 잘 처리가 된다.

    참고로.. 귀찮아서 적지는 않았지만..

    this.Controls["textBox1"].Text = "ddd";

    이런식으로 사용하거나 또는 find를 가지고 바로 컬랙션안의 포함된 컬랙션내부 개체를 억세스 하거나

    하는 방법이 있다.

    this.Controls[0].Text = "ddd";

    문제는 이건 적을만한 수준이 아니란 거다..

    이렇게 쉽게(?) 적었는데도 모르겠다면. C#책에서. Collection 에 대해서 공부해 보길 권한다.

    ps) 노파심에 끄적이자면.. 실무에서는 이것보다는 좀 더 세련된 형태로 함수를 만들어서 사용한다.

    잘.. 다듬어서 사용하길 권한다.

    ps2) 예외 사항에 대처하는법에 대해서 몇가지 더 끄적여 보자. (댓글 덕분에 더 적어본다.)

    예외사항은.. 여러가지가 있겠는데 결론적으로 말해서 특정한 녀석만 위의 루틴이 돌아갈때 처리가 되지 않아야 된다는 이야기다.

    만약 그런것이 아주 많다면..  IF를 이용해야 겠지만.

    하나 둘의 경우 Find를 사용해 주는게 좋다.

    강좌를 적고 이미 이 프로젝트를 날린 입장이라.. 예제를 더 못 보여주는것은 아쉬우나.

    --> this.Controls.Find("textBox1", true);

    이런형태를 통해서 대부분 예외를 처리하는걸로 알고 있다.

    여기서 핵심은 뒤에 true 를 주는것이고 내부적으로(c#)에서 재귀호출함수를 이용해서 컬랙션개체 안에 있는것들까지

    찾아서 그 인스턴스값을 돌려준다. 단지 문제는 귀찮게도 control[] 배열로 돌려준다는것이긴 하지만..

    그래서 개인적인 입장에서는 앞에서 만든 ArrayList 에서 특정값을 제거한다. remove 를 통해서 돌아야 하는것중

    예외사항을 제거하고 돌린다.

    위의 재귀호출함수는 이해를 위해서 3줄로 작성되어 있지만.. 실제적으로 사용하고 있는것은.. 함수가 아닌 클래스로

    대략.. 30댓줄의 몇몇개의 기능이 추가되어 있다. 귀찮게 arraylist를 선언하지도 않고.. 이런 예외를 편하게 제거하도록 말이다. 개인적 취향에 맞도록 잘 만들면 되지 않을까 한다.

    ps3) 댓글의 관심에 감사함을 전한다.

'C# > 일반적인코딩' 카테고리의 다른 글

ListView에서 Drag &amp; Drop  (0) 2008.12.29
C#의 Setting Class  (0) 2008.11.22
시리얼 장비 통신에 대한 짧은 이야기  (0) 2008.11.21
posted by 삶의여유로움
: