본문 바로가기
C#/c#

C# Tip

by izen8 2012. 1. 26.
반응형

- 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);

반응형

댓글