반응형

완전샤푸님의 블로그에서 발췌하였습니다.

눈에 보이는 괜찮은 팁이 몇 가지 있네요. ^^

 

 

 

- Form

 

 

1. MDI 폼의 경우 자식 폼에 MDI 부모 품을 설정 하는 방법
// 자식 폼의 생성자에서 부모 폼의 인스턴스를 넘겨 주어 설정하도록 한다.

public ChildForm( MainForm frm )

{

        InitializeComponent();


        this.MdiParent = frm;

……….

}





2. 다이얼로그 폼 사용

LogInForm frm = new LogInForm();

frm.StartPosition = FormStartPosition.CenterScreen;  // 다이얼로그 폼을 중심으로 이동

frm.ShowDialog();

                     

if( DialogResult.OK == frm.DialogResult )

{

      ………………………………………

}







- 컨트롤



1. 리스트, 리스트뷰 컨트롤



- 컬럼 지정

: 리스트 및 리스트 뷰 컨트롤의 컬럼을 프로그래밍으로 지정 할 수 있지만 디자인 모드에서 더욱 쉽게

추가 할 수 있다. 예는 리스트 뷰로 하지만 리스트 컨트롤과 방법은 같다.

리스트 뷰 컨트롤을 지정한다.


속성 창에서 ‘Colummns’ 속성을 클릭 한다.



‘ColumnHeader 컬렉션 편집기가 나타난다.


여기서 컬럼을 추가 하기 위해 ‘추가’버튼을 누르면 오른쪽에 속성을 주는 부분이 나온다. 컬럼명과 넓이 등을 지정하면 된다.

* 프로그래밍적 방법
ListView.Columns.Add( "이름", 40, HorizontalAlignment.Center );





- 데이터 모두 삭제
ListView.Items.Clear();




- 데이터 추가

ListViewItem lvi = new ListViewItem();

lvi.SubItems.Add( “최흥배” );

lvi.SubItems.Add( “프로그래머팀” );

lvi.SubItems.Add( “서버파트” );

ListView.Items.Add( lvi );

ListView.Refresh(); 




- 데이터 추가 2

: 위의 방식은 컬럼의 첫번째가 이미지 리스트인 경우는 좋지만 리스트 뷰의 첫 컬럼에 어떤 문자를

나타내고 싶은 경우는 되지 않는다. 이런 경우 ListVieeItem의 생성자의 인자에 첫 컬럼에 나타내고 싶은

문자를 지정해 줘야 한다.

ListViewItem lvi = new ListViewItem( iCount.ToString() );

lvi.SubItems.Add( “최흥배” );

lvi.SubItems.Add( “프로그래머팀” );

lvi.SubItems.Add( “서버파트” );

ListView.Items.Add( lvi );

ListView.Refresh(); 




- 삽입된 모든 데이터 순회
int iItemNum = ListView.Items.Count;

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

{

        iYear = Convert.ToInt32(ListView.Items[i].SubItems[ 0 ].Text ); 

        ………..

|




- 기존 데이터 수정

……….

ListView.Items[i].SubItems[ 0 ].Text = iYear.ToString();

……..




- 특정 데이터 삭제 ( 순회 방법을 foreach를 사용함 )

………

foreach( ListViewItem lvi in ListView.Items )

{

        if( lvi.SubItems[ 0 ].Text == “2005” )

               ListView.Items.Remove( lvi );

}

…………




- 리스트 뷰의 특정 행을 선택한 경우 알고 싶을 때
ListView.SelectedListViewItemCollection  Items = ListView.SelectedItems;


// 리스트 뷰의 컨트롤 속성이 멀티 선택 가능 상태에서 복수 개 선택을 하였다면 선택된 것이 다 나온다.
foreach( ListViewItem lvi in Items )

{

…….

}





2. 콤보 박스


- 콤보 박스의 데이터 모두 삭제

: combobox.Items.Clear();




- 데이터 추가

: combobox.Items.Add( “LIFEOnline” );




- 목록 중 지정된 데이터 목록을 찾아서 선택 되도록 하기

int index = combobox.Items.IndexOf(“LIFEOnline” );

if( index < 0 )

return;


combobox.SelectedIndex = index;







3. 그리드 컨트롤


- 그리드 컨트롤을 실행 시 데이터 추가

DataGrid grid = new DataGrid();

DataTable dt = new DataTable();

DataRow dr;



// 컬럼 헤드를 추가

dt.Columns.Add( new DataColumn("아이템", typeof(string)) );

dt.Columns.Add( new DataColumn("Code", typeof(Int32)) );

                                

// 레코드 추가                                 

dr = dt.NewRow();

   

dr[ 0 ] = “칼”;  // 아이템 컬럼에 아이템 이름 추가

dr[ 0 ] = 110;    // 코드 컬럼에 코드 번호 추가

                                

dt.Rows.Add(dr);  // 레코드를 추가 한다.



DataView dv = new DataView(dt); // 데이터 뷰를 만든다.

grid.DataSource= dv;               // 그리드 컨트롤에 추가



- 그리드 컨트롤의 컬럼 스타일 지정

그리드 컨트롤에 데이터를 넣르면 컬럼이 지멋대로 되는 경우가 있다.. 이럴 때 원하는 스타일로

컬럼을 지정하면 된다..다만 꼭 데이터를 다 넣은 후에 해야 된다. 그전에 하면 데이터를 넣으면서
원하지 않는 상태로 변경되어 버린다.

…………………………………………………………….

DataGridTableStyle gtStyle1 = new DataGridTableStyle();  



gtStyle1.GridColumnStyles.Add(new DataGridTextBoxColumn());

gtStyle1.GridColumnStyles[0].MappingName = “아이템”; // 이 이름이 컬럼 스타일을 바꾸기를 원하는 컬럼의

                                                                          // 텍스트와 꼭 같아야 된다.

gtStyle1.GridColumnStyles[0].HeaderText = “아이템”;    // 컬럼의 텍스트를 지정한다.

gtStyle1.GridColumnStyles[0].Alignment = HorizontalAlignment.Center; // 중간 정렬

gtStyle1.GridColumnStyles[0].Width = 70;                               // 폭 지정

gtStyle1.GridColumnStyles[0].NullText = string.Empty;




gtStyle1.GridColumnStyles.Add(new DataGridTextBoxColumn());

gtStyle1.GridColumnStyles[0].MappingName = “Code”;    // 이 이름이 컬럼 스타일을 바꾸기를 원하는 컬럼의

                                                                 // 텍스트와 꼭 같아야 된다.

gtStyle1.GridColumnStyles[0].HeaderText = “Code”;       // 컬럼의 텍스트를 지정한다.

gtStyle1.GridColumnStyles[0].Alignment = HorizontalAlignment.Center; // 중간 정렬

gtStyle1.GridColumnStyles[0].Width = 70;                               // 폭 지정

gtStyle1.GridColumnStyles[0].NullText = string.Empty;



grid.TableStyles.Add(gtStyle1);            // 그리드 컨트롤에 세팅 한다.

……………………………………………………………..










- ADO.NET

1. 오라클 DB 연결

string strCommonConnection = “Data Source=ORA10;User ID=admin;assword=1111”;

OracleConnection OraCommonDBConnt = new OracleConnection( strCommonConnection );

OraCommonDBConnt.Open();




2. 오라클 DB 끊기

if( ConnectionState.Open == OraCommonDBConnt.State  )

        OraCommonDBConnt.Close();




3. DataSet을 사용한 쿼리 작업

OracleDataAdapter OraDataAdapter = new OracleDataAdapter();

OracleCommand cmd = new OracleCommand();

cmd.Connection = OraCommonDBConnt;

cmd.CommandText = “SELECT * FROM Member”;

OraDataAdapter.SelectCommand =  cmd;

OraDataAdapter.Fill( ResultDataSet , strTableName );




4. DataReader를 사용한 쿼리 작업

OracleDataAdapter OraDataAdapter = new OracleDataAdapter();

OracleCommand cmd = new OracleCommand();

cmd.Connection = OraCommonDBConnt;

cmd.CommandText = “SELECT * FROM Member”;

DataReader outDataReader = cmd.ExecuteReader();

               

if( false == outDataReader.HasRows )

return false;


………….

// 원하는 필드의 인덱스 번호를 알아낸다.

int IndexDex   = outDataReader.GetOrdinal("Dex");

…………..




while( dataReader.Read() )

{

   …………………..

    CharInfo.DEX = outDataReader.GetInt32( IndexDex );

   ……………….

}




5. 테이블의 데이터 모두 삭제

string strContext = "DELETE FROM " + TableName;

OracleCommand cmd = new OracleCommand();

cmd.Connection = OraCommonDBConnt;

cmd.CommandText = strContext;

cmd.ExecuteNonQuery();




6. DataSet의 내용을 DataGrid 컨트롤에 넣기

GridQueryResult.SetDataBinding( ResultDataSet, strTableName );




7. 간단하게 DataSet을 이용한 테이블의 데이터 갱신

// 이전에 쿼리 작업을 한 DataAdapter를 사용해야 된다. 그렇지 않을 경우 DataAdapter에 업데이트 및 삭제 로직을

// 등록 해줘야 된다.

// 이 작업은 쿼리를 하여 DataGrid 컨트롤에 넣은 경우 DataGrid의 데이터를 수정 한 후 이 내용을 DB에 업데이트

// 하고 싶을 때 사용한다.

OracleCommandBuilder cb = new OracleCommandBuilder( OraDataAdapter ); 

cb.RefreshSchema();

OraDataAdapter.Update( dataset, TableName );




8. DataSet의 내용을 XML 파일로 저장

DataSet ds = new DataSet();

……….

ds.WriteXml( filename );
// 이후 위의 7번 방식을 이용해서 데이터를 추가 한다.

……





9. 테이블의 모든 데이터를 지우고 XML의 데이터를 추가 하기

// 테이블의 레코드를 모두 지운다.

……….

// ds 라는 DataSet에서 XML 파일을 읽어 들인다.

DataSet ds = new DataSet();

ds.ReadXml( textBoxFilePath.Text );










- 파일



1. 클래스 단위로 파일에 쓰기

이 직렬화 방식은 꼭 .NET 플랫폼에서 서로 파일을 읽고 쓸 때만 사용 가능하다.
만약 .NET으로 만든 프로그램에서 아래와 같이 파일을 만들고 이것을 네이티브에서

읽으면 앞에 다른 값이 들어가 있다( 정확하게는 직렬화 되는 클래스의 메타 정보가

들어가 있다 ).


FileStream GloveFile = new FileStream( "0.ipt", FileMode.Create);

BinaryFormatter formatter = new BinaryFormatter();

formatter.Serialize( GloveFile, ItemFileclass );





2. 현재 실행 하고 있는 프로그램의 실행 경로 얻기

Environment.CurrentDirectory

를 이용하면 실행 경로를 얻을 수 있다.







- 네트워크

1. 웹에 있는 파일을 받기

정확하게 말하면 http 프로토콜을 이용하여 웹에 있는 파일을 다운로드 하는 방식을 말한다.

WebRequest myWebRequest = WebRequest.Create("http://jacking75.cafe24.com/Index.hml"); 

WebResponse myWebResponse = myWebRequest.GetResponse(); 



Stream ReceiveStream = myWebResponse.GetResponseStream();



ReceiveStream 객체를 파일 스트림을 이용하여 파일로 저장 하던가 다른 스트림으로 사용하면 된다.








- ETC



1. C#에서의 XML 주석 코드 제작을 위한 주석 작성 요령

: public bool IsEnableExecute( int iReqList )
{

    …………

}

가 있다면 

/// <summary>

/// 현재 수행하는 기능을 수행 가능한가

/// <summary>

/// <param name="iReqList">수행할 기능의 인덱스</param>

/// <returns name="true">수행가능</returns> 

/// <returns name="false">수행불능</returns>

public bool IsEnableExecute( int iReqList )
{

    …………

}

이렇게 작성한다.




2. 다른 클래스에 있는 const로 정의한 상수를 이용 방법
: 상수는 다음과 같이 정의 되어 있다.

public class PacketDefine 

{

   Public const int Packet_First = 0;

   ………..

}



이것을 Command 클래스에서 사용 할려면

…………

Int packetfirst = PacketDefine.Packet_First;

………….


사용한다. 




3. 데이터 변환.

: 데이터 변환을 위해서는 Convert의 멤버를 사용한다.

Convert.Toxxx( xxx )를 사용하면 된다. 
예) 스트링을 int 변환
Convert.ToInt32( string );




3. 바이트 배열을 지정된 위치와 크기로 복사할 경우
: Buffer.BlockCopy( ……. );




4. 클래스의 크기를 알고 싶을 때

: Marshal.SizeOf(LoginPacket)

LoginPacket는 인스턴스 화된 객체이어야만 한다. LoginPacket의 클래스인 LOGIN_PACKET를 사용하면 안된다.




5. 외부 프로그램 실행

: 여기서 인터넷 익스플로어를 실행해서 본인의 홈페이지에 가는 것을 예를 들겠다.

System.Diagnostics.Process IEProcess = new System.Diagnostics.Process();

IEProcess.StartInfo.FileName = "iexplore.exe";

IEProcess.StartInfo.Arguments = "http://jacking75.cafe24.com ";

IEProcess.Start();



6. 메시지 박스

- 일반 메시지 박스 사용

MessageBox.Show( "클라이언트에서 사용할 스킬 정보를 파일로 저장 하겠습니까 ?" );



- YES / NO 버튼 사용

if( DialogResult.Yes == MessageBox.Show( "클라이언트에서 사용할 스킬 정보를 파일로 저장 하겠습니까 ?",

                                                            "이진 파일 저장", MessageBoxButtons.YesNo ) )



7. 한글 파일 출력 문제

- 정확한 이유는 모르지만 한글을 파일에 입력할 때 인코딩을 Default 방식으로 지정하면

한글 XP에서는 한글을 아스키 코드 값으로 제대로 인식하지만 윈도우 2003에서는 한글을

유니코드 방식으로 인식하여 한글 1글자를 아스키 코드 1글자로 인식하는 경우가 있다.


string strValue = “개”;

encodedBytes = System.Text.Encoding.Default.GetBytes(strValue);         



한글 XP에서 읽는다면 encodedBytes의 길이가 2개로 나오지만 윈도우 2003에서는

길이가 1로 된다.



이 문제를 해결할려면 인코딩 방식을 명시적으로 지정해야 된다.

string strValue = “개”;

encodedBytes = System.Text.Encoding.GetEncoding(949).GetBytes(strValue);




8. 폼의 마우스 커서 변경

- 화살표 마우스 커서      this.Cursor = Cursors.Arrow;

- 모래시계 커서                this.Cursor = Cursors. WaitCursor;

- 손 커서                         this.Cursor = Cursors. Hand;

- 기본 커서                      this.Cursor = Cursors. Default;

등등…….




9. 네이티브의 time(&time_t)에서 얻은 초단위의 시간을 C#에서 사용

- time함수를 이용하여 얻은 시간은 시작이 1970년부터이고 C#의 경우는

0년 1월1일 부터이다..그래서 서로 호환이 되지 않느다. 이것을 해결할려면

다음과 같이 하면 된다.



int iTime = C타임함수값;    
DateTime dt = new DateTime(1970, 1, 1, 9, 0, 0); // 한국은 GMT+9시간
dt = dt.AddSeconds(iTime);

반응형

+ Recent posts