728x90

C#에서는 WinHttp.WinHttpRequest.5.1대신하여 HttpWebRequest를 사용할 수 있다.


WinHttp.WinHttpRequest.5.1 에서는

MessageBox.Show(http.GetAllResponseHeaders()); 를 이용하여 헤더 정보값을 확인할 수 있는데


HttpWebRequest 에서는 GetAllResponseHeaders() 함수가 없다.

이거 알아내느라고 개고생했다. 구글링, 네이버 검색해도 정보가 잘 검색되지 않는다.

결국 확인해보니 모든 헤더정보를 보여주는게 아니라, 해당 헤더정보를 읽어낼 수 있게 되어 있었다.

response.GetResponseHeader("Set-Cookie");


해당 헤더 정보를 읽어서 원하는 정보를 파싱(추출)하여 원하는 결과를 얻어냈다.


HttpWebRequest 클래스 : https://msdn.microsoft.com/ko-kr/library/system.net.httpwebrequest.aspx

using System.Net

using System.IO

두개의 Namespace 를 선언한다.


데이터를 byte 단위로 가져오기 때문에 StreamReader 가 필요하다.

POST 방식은 ID와 패스워드(PW)를 입력받아 입력받은 정보로 request 를 보내고, 응답받은 결과 메시지를 확인하여 필요한 정보를 추출하여 로그인 성공/실패 처리를 하도록 한다.


private string doLogin(string ID, string PW)
{
    string url = "http://www.abc.com/";
    string PostData = string.Format("r=home&a=login&referer=%2F%3F&__target=_parent&id={0}&pw={1}", ID.Trim(), PW.Trim());

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.Referer = "http://www.abc.com/?r=home&system=iframe.login&iframe=Y&referer=%2F%3F";
    request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)";
    request.ContentType = "application/x-www-form-urlencoded";
    request.KeepAlive = true;
    request.AllowAutoRedirect = false;

    byte[] sendData = UTF8Encoding.UTF8.GetBytes(PostData);

    Stream dataStrem = request.GetRequestStream();
    dataStrem.Write(sendData, 0, sendData.Length);
    dataStrem.Close();

    string resResult = string.Empty;
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader readerPost = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8, true);   // Encoding.GetEncoding("EUC-KR")
    resResult = readerPost.ReadToEnd();
    //string cookie = response.GetResponseHeader("Set-Cookie"); // 쿠키정보 값을 확인하기 위해서
    //MessageBox.Show(cookie);
    //MessageBox.Show(resResult);
    readerPost.Close();
    response.Close();

    CK = false;
    if (resResult.IndexOf("패스워드가 일치하지 않습니다.") > 0)
    {
        MessageBox.Show("패스워드가 틀렸습니다", "알림", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        this.txtPwd.Focus();
    }
    else if (resResult.IndexOf("history.go(-1);//]]>") <= 0)  // 웹페이지 메세지가 없으면
    {
        if (response.GetResponseHeader("Set-Cookie").IndexOf("PHPSESSID=") != -1// 값이 없으면 - 1을 반환
        {
            CK = true;
            string strSessionID = SSplit(SSplit(response.GetResponseHeader("Set-Cookie"), "PHPSESSID=", 1), ";", 0);
            strID = txtID.Text;
            return strSessionID;
        }
    }
    return strID;  // 패스워드가 틀릴 경우에는 입력되는 ID값을 전달 받지 못하므로 null
}


// 엑셀 VBA 함수 Split 처럼 함수로 만들어서 사용

public static string SSplit(string _body, string _parseString, int index)
{
    string varTemp = _body.Split(new string[] { _parseString }, StringSplitOptions.None)[index];
    return varTemp;
}



ID가 null 인 경우에는 다음 단계 진행이 안되도록 처리


private void MainForm_Load(object sender, EventArgs e)
{
    frmLogin f2 = new frmLogin();  // 클래스 이름
    f2.ShowDialog();
    if (f2.getstrID == null)  // ID 입력값이 없으면 종료처리
    {
        Application.Exit();
    }
    else
    {
        this.Text = "접속 ID : " + f2.getstrID;
        this.WindowState = FormWindowState.Maximized;
        status_date(); 

        // 기본 처리할 내용 처리
    }
}


블로그 이미지

Link2Me

,
728x90

실행하면 웹브라우저 창이 뜨는 방식이다.

System.Diagnostics.Process.Start("http://subscene.com/");


웹브라우저 화면을 C# 프로그램 창 내부에 보이도록 하는 경우에는

//getCurrentBrowser().Navigate(adress);


private void searchTextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        getCurrentBrowser().Navigate("http://endic.naver.com/search.nhn?sLn=kr&query=" + searchTextBox.Text);
    }
}



블로그 이미지

Link2Me

,
728x90

지정된 타이머 간격이 경과되고 타이머를 사용할 수 있을 때 발생다.


도구상자에서 타이머를 끌어다 놓는다.


타이머를 선택하고 이벤트 아이콘을 클릭하여 Tick 이벤트를 더블 클릭한다.



this.timer1.Tick += new System.EventHandler(this.timer1_Tick); 다.

private void timer1_Tick(object sender, EventArgs e)
{
    timer1.Enabled = false;
    listView_MyItem(listView1);  //
타이머에서 동작시킬 사용자 함수
}


위의 굵은 글씨 부분을 보면 User가 직접 작성하는 코드를 어떻게 추가하는지를 알 수 있다.

마우스 휠 이벤트는 제공하지 않는데 마우스 휠 이벤트를 추가하는 방법은

this.listView1.MouseWheel += new MouseEventHandler(this.listView_MouseWheel); // 마우스 휠 이벤트

private void listView_MouseWheel(object sender, MouseEventArgs e)
{
    listView_MyItem(listView1);  // 사용자 함수
    timer1.Enabled = true;
}


리턴타입은 void, 두개의 argument를 받는 데, 첫번째 인자는 object 타입, 두번째 인자는 EventArgs의  자식클래스이다.


필요에 따라 timer1.Interval = 5000; // 5초 단위

로 설정하면 된다. bool flag 와 같이 코딩할 수도 있다.


Designer.cs 파일에서 timer 찾기로 찾아보니

this.timer1 = new System.Windows.Forms.Timer(this.components);

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

private System.Windows.Forms.Timer timer1;

이 3줄이 추가되어 있다.


다른 걸 좀 더 찾아보니

this.listView1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseClick);

이렇게 추가되어 있다. 마우스 휠 이벤트도 정확하게는

this.listView1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.listView_MouseWheel); 로 적어주는게 맞는가 보다.


http://www.csharpstudy.com/CSharp/CSharp-event.aspx 에 보면 이벤트 핸들러 설명이 잘 되어 있다.



제공하는 이벤트가 아니라 직접 타이머를 만들어서 사용할 때를 알아보자.

System.Windows.Forms.Timer mytimer = new System.Windows.Forms.Timer();

는 전역변수 선언공간에 선언한다.



mytimer.Interval = 100;

mytimer.Tick += new EventHandler(timer_tick);

mytimer.Start();


void timer_tick(object sender, System.EventArgs e)
{
      수행할 작업
      mytimer.Stop();
}


다.








블로그 이미지

Link2Me

,
728x90

자막에 나오는 시간 단위를 받아서 보기 좋게 정렬하는 코드이다.


public double TimeCodeValue(string timecode)
{
    // 00:01:53,039
    string[] parts = timecode.Replace(",", ":").Split(':', ',');
    double Hours = int.Parse(parts[0]);
    double Minutes = int.Parse(parts[1]);
    double Seconds = int.Parse(parts[2]);
    double Milliseconds = int.Parse(parts[3]);

    return (Hours * 3600 + Minutes * 60 + Seconds) * 1000 + Milliseconds;
}

public string TimeCodeFormat(double timecodevalue)
{

    // 91469

    double temptime = System.Math.Truncate(timecodevalue / 1000); // 몫
    double hour = System.Math.Truncate(temptime / 3600);
    double minute = System.Math.Truncate(temptime % 3600 / 60);
    double seconds = temptime % 3600 % 60;
    double milliseconds = timecodevalue % 1000; // 나머지
    return string.Format("{0:0}:{1:00}:{2:00},{3:000}", hour, minute, seconds, milliseconds);
}


1. 밀컨즈(milliseconds) 출하고
2. 시간 단위로 환산하기 위해서 3600(60분 X 60초)로 나눈 몫을 구한다.

    Math.Truncate 함수를 사용하여 반올림하지 않고 정수만 잘라낸다.

3. 분 단위로 환산하기 위해서

    시간단위로 나눈 나머지를 가지고 다수 몫을 구한다.

4. 초 를 구하기 위해서는

    시간단위, 분단위를 구한 나머지를 구한다.

5. 밀리세컨즈(milliseconds) 는 초단위로 환산하는 나머지를 구하면 된다.







'C# > 문법 및 기능' 카테고리의 다른 글

C# URL 경로 링크  (0) 2015.11.10
C# Timer.Tick 이벤트, 이벤트 분석  (0) 2015.10.22
C# 몫과 나머지 구하기  (0) 2015.10.17
C# 문자열 다루기 StringBuilder  (2) 2015.10.10
C# 문자열 분리 Split  (0) 2015.10.09
블로그 이미지

Link2Me

,
728x90

C# 에서 몫(quotient) 과 나머지(remainder) 구해보자.


double a = 60;
double b = 23;
double c = a / b;
double quotient = System.Math.Truncate(c); // 몫
double remainder = a % b;  // 나머지
MessageBox.Show(c.ToString() + " 몫 : " + quotient.ToString() + " 나머지 : " + remainder.ToString());



몫을 구할 때 이렇게 안해주면 반올림 처리하여 3으로 표시될 수 있다는 점에 주의해야 한다.


블로그 이미지

Link2Me

,
728x90

public int IndexOf(string value);

// 문장내에서 특정 문자나 문자열이 맨 처음 발견되는 인덱스 번호를 알려주는 메서드

public string Replace(string oldValue, string newValue);

// 원래 문자/문자열을 대체할 문자/문자열로 변경

public string Substring(int startindex, int lenght);

// 시작위치 길이만큼 결과를 돌려줌, 는 0

다.



string delimiter = ",";  // 구분자
string _Header = string.Empty;
for (int i = 0; i < dgv.Columns.Count; i++)
{
    string strr = dgv.Columns[i].HeaderText;
    _Header += strr + delimiter;
}
_Header = _Header.Substring(0, _Header.Length - 1);  // 막 1
_Header = _Header.Trim();
MessageBox.Show(_Header);



System.Text.StringBuilder 클래스는 문자열을 버퍼형식으로 수정할 수 있도록 도와주는 클래스로 문자열을 추가, 수정, 삭제, 검색 등의 기능을 제공한다.


Append : 현재 StringBuilder 의 끝에 정보를 추가
Insert : 문자열/개체를 StringBuilder에서 지정한 인덱스 위치에 삽입
Remove : 현재 StringBuilder 에서 지정한 수만큼의 문자를 제거
Replace : 지정된 인덱스에 있는 문자를 대체
CopyTo : 현재 StringBuilder 특정위치에서 시작하여 바이트수만큼 목적지 문자배열의 특정위치에 복사할 때 사용
ToString : StringBuilder 의 값을 문자열로 변환


문자열을 합쳐나갈 때 StringBuilder 를 사용하면 처리속도가 훨씬 빠르다.

위에서 구분자(delimiter)를 주고 문자열을 합치고, 다시 Substring 으로 잘라내는 것보다 코드도 깔끔하고 성능도 우수하다.

StringBuilder sb = new StringBuilder();
for (int i = 0; i < dgv.Columns.Count; i++)
{
    if (sb.Length > 0)  // 최초에는 sb 길이가 0 이므로 , 가 추가되지 않는다.
    {
        sb.Append(",");
    }
    sb.Append(dgv.Columns[i].HeaderText);
    MessageBox.Show(sb.ToString()); // for 문을 돌면서 sb문자열의 결과를 확인
}


sb.Append(dgv.Columns[i].HeaderText); 대신에 sb.Append("'" + dgv.Columns[i].HeaderText + "'"); 를 하면 작은 따옴표로 값을 감싸면서 문자열을 얻어낼 수 있다.




블로그 이미지

Link2Me

,
728x90

C# Split함수의 경우 직접 문자열을 구분자로 줄수 없다.

Split 은 기본적으로 문자를 입력 받도록 되어 있다. 문자열을 char[]형식으로 변경 후 사용 가능하다.


string str = "서울시/서초구/양재동";
string[] result = str.Split(new char[] { '/' });  // /열 result 라.
for (int i = 0; i < result.Length ; i++)  // 은 0 며,
{
    MessageBox.Show(i + "번째 배열 ==> " + result[i]);
}


string str = "jsk005@naver.com";
char[] sp ="@".ToCharArray();
string[] result = str.Split(sp);
for (int i = 0; i < result.Length; i++)
{
    MessageBox.Show(i + "번째 배열 ==> " + result[i]);
}


string str = "홍 길 동";
string[] result = str.Split(new char[] {' '});  // new char[] {} 도 공백으로 나눈다는 의미
for (int i = 0; i < result.Length; i++)
{
    MessageBox.Show(i + "번째 배열 ==> " + result[i]);
}


위의 예제와 아래 예제의 차이점을 보면 split 자(char)열(string)이다.

string 으로 할 경우에는 반드시 StringSplitOptions.None 또는 StringSplitOptions.RemoveEmptyEntries 까지 추가해줘야만 에러가 발생하지 않는다. 물론 위의 것도 StringSplitOptions 를 추가해줘도 된다.


string str = "홍길동~~~이순신~~~강감찬~~~을지문덕";
string[] result = str.Split(new string[] {"~~~"}, StringSplitOptions.None);
for (int i = 0; i < result.Length; i++)
{
    MessageBox.Show(i + "번째 배열 ==> " + result[i]);
}

string[] separator = new string[1] { "\r\n\r\n" };  //분리할 기준 문자열
string[] strResult = s.Split(separator, StringSplitOptions.RemoveEmptyEntries);

  

* StringSplitOptions.None  //

* StringSplitOptions.RemoveEmptyEntries  // 반환값에 빈 부분 문자열 포함 안됨


foreach (string strValue in strResult)
{
   
}

또는

for (var i =0 ; i < strResult.Length ; i++)

{

}


//구

string str = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] { "[stop]" };
string[] result = str.Split(stringSeparators, StringSplitOptions.None);

for (int i = 0; i < result.Length; i++)
{
    if (String.IsNullOrEmpty(result[i]))  // null
    {
        MessageBox.Show("null" + result[i]);
    }
    else
    {
        MessageBox.Show(i + "번째 배열 ==> " + result[i]);
    }               
}


아래와 같이StringSplitOptions.RemoveEmptyEntries 으로 수정하면 결과가 어떻게 나올까?

string str = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] { "[stop]" };
string[] result = str.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries); 

// 반환값에 빈 부분 문자열 포함 안됨
for (int i = 0; i < result.Length; i++)
{
    if (String.IsNullOrEmpty(result[i]))
    {
        MessageBox.Show("null" + result[i]);
    }
    else
    {
        MessageBox.Show(i + "번째 배열 ==> " + result[i]);
    }               
}

결과는 null 이나 공백은 무시되므로 배열은 0, 1, 2 만 추출된다.




System.Text.RegularExpressions.Regex.Split(자를 문자열, 정규식 문자열)

using System;
using System.Text.RegularExpressions;


string str = "cat\r\ndog\r\nanimal\r\nperson";
string[] result = Regex.Split(str, "\r\n");
for (int i = 0; i < result.Length; i++)
{
    MessageBox.Show(i + "번째 배열 ==> " + result[i]);
}



포함된 문자열의 개수 구하기
int
count = source.Split('/').Length - 1;


블로그 이미지

Link2Me

,
728x90

C# 에서 파일을 저장하고 저장된 파일명을 팝업창으로 보여주고 싶을 때



string filePath = @"C:\Dir\SubDir\file.txt";


string path = Path.GetDirectoryName(fileName);  //
string filename_with_ext = Path.GetFileName(fileName);  //
string filename_without_ext = Path.GetFileNameWithoutExtension(fileName);  //
string ext_only = Path.GetExtension(fileName);  //

DateTime dt = File.GetLastWriteTime(fileName); // 일/


간단 명료하게 함수로 만들어서 사용해도 된다.

private string getFileName(string filePath)
{
     return System.IO.Path.GetFileName(filePath);
}

private string getFilePath(string filePath)
{
     return System.IO.Path.GetDirectoryName(filePath);
}

private string getFileExt(string filePath)
{
     return System.IO.Path.GetExtension(filePath);
}


// 현재 디렉토리 경로 가져오기

string currentPath = System.IO.Directory.GetCurrentDirectory();


// 디렉토리 생성

public static void CreateDirectory(string filePath) 

    if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); 


// 파일 삭제

public static void DeleteFile(string filePath) 

    if (File.Exists(filePath)) File.Delete(filePath);   //파일 삭제   
}


'C# > 문법 및 기능' 카테고리의 다른 글

C# 문자열 다루기 StringBuilder  (2) 2015.10.10
C# 문자열 분리 Split  (0) 2015.10.09
C# 변수 선언, 제어문과 자동완성 기능  (2) 2015.09.25
C# enum  (0) 2015.09.23
C# 과 VB 문법 차이  (0) 2015.09.22
블로그 이미지

Link2Me

,
728x90

변수(Variable) : 메모리상의 임시 데이터 공간

// 1. 변수 선언    --> 나 _ (바)다. 다.

// 2. 변수 초기화(할당)  --> 미,

// 3. 변수 참조(사용)

// 4. 변수의 데이터 타입을 반환 : GetType()  (필요시)


다.

변수 타입 : Value 타입, Reference 타입

Value 타입으로 변수를 선언하면 자동으로 메모리가 생성된다.

Reference 타입으로 변수를 선언하면 참조변수에 해당하는 메모리만 생성된다.

실제 메모리는 new 연산자를 이용해서 생성해주어야 한다.


문(if, switch) , 문(for, foreach, while), 문(break, continue) 다.

C#의 조건문/반복문(if, for, while)의 조건식은 반드시 논리형(bool)이어야 한다.

while 문은 조건식에 의해서만 반복 수행이 결정된다.

다.




두번 탭을 누르면 자동으로 아래처럼 IF문 형다.



이제 IF문 형태에 실제 코드를 작성하면 된다.




이제 FOR 문에 대해서도 for 을 입력하고 탭을 2번 누르면 for 문 형태가 자동으로 만들어진다.



지역변수 i 가 자동으로 선언되고 수정할 부분이 어디인지 화면에 보여준다.

그 부분을 수정하고 실제 수행할 코드를 완성시키면 된다.


for 문은 초기화, 조건식, Step 3가지로 나뉘어진다.

- 정해진 횟수만큼 반복적으로 수행할 때 for문을 사용한다.

- 한계나 범위가 주어져 있을 때는 for문을 사용한다.

- 특정 조건에만 반복 수행할 때에는 while 문을 사용한다.



do while 문은 최소한 1번은 실행된다.

do 를 입력하고 탭을 두번 누르면 do while 문의 형태가 자동으로 만들어진다.




while



수, 다.

이 사항은 경험으로 배우게 되는 거라 그런지 책에 언급되어 있는 경우가 거의 없다. 아니면 내가 무심코 지나쳐 버렸거나...


'C# > 문법 및 기능' 카테고리의 다른 글

C# 문자열 분리 Split  (0) 2015.10.09
C# 파일 경로, 파일명, 확장자, 현재 경로  (0) 2015.09.29
C# enum  (0) 2015.09.23
C# 과 VB 문법 차이  (0) 2015.09.22
C# Controls  (0) 2015.09.18
블로그 이미지

Link2Me

,

C# enum

C#/문법 및 기능 2015. 9. 23. 00:30
728x90

enum은 열거형 상수(constant)를 표현하기 위한 것으로 프로그램을 읽기 쉽게 해준다.
enum문은 클래스 안이나 네임스페이스내에서만 선언될 수 있다.
enum의 각 요소는 첫번째 요소가 0, 두번째가 1 등으로 1씩 증가된 값들을 할당받는다.
개발자가 임의로 의미있는 번호를 지정해 줄 수도 있다.


enum <enum_name>
{
    enumeration list
}

enum Days
// 순서는 상관없고 같은 값을 가지는 이름이 여러개 있어도 괜찮다.

// 만약 따로 값을 지정하지 않으면, 첫번째는 0, 두번째는 1, 세번째는 2 식으로 자동 지정된다.
    Sunday = 1,
    Monday = 2,
    Tuesday = 3,
    Wednesday = 4,
    Thursday = 5,
    Friday = 6,
    Saturday = 7
}

//get value
int day = (int)Days.TuesDay;  // int 로 형변환

//cast to enum
Days day = (Days)3;

MyEnum myenum = (MyEnum)Enum.ToObject(typeof(MyEnum) , intvalue);
Days day = (Days)Enum.ToObject(typeof(Days), 3);



블로그 이미지

Link2Me

,
728x90

출처 : http://blog.daum.net/pepmanager/7866894


VB             C#

UBound()     = yourArray.GetUpperBound(0) or yourArray.Length for one-dimesional arrays
LBound()     = yourArray.GetLowerBound(0)
IsNothing()   = Object.ReferenceEquals(obj,null)
Chr()           = Convert.ToChar()
Len()          = "string".Length
UCase()      = "string".ToUpper()
LCase()      = "string".ToLower()
Left()          = "string".Substring(0, length)
Right()        = "string".Substring("string".Length - desiredLength)
RTrim()       = "string".TrimEnd()
LTrim()        = "string".TrimStart()
Trim()          = "string".Trim()
Mid()        = "string".Substring(start, length)
Replace()    = "string".Replace()
Split()      = "string".Split()
Join()       = String.Join()
MsgBox()     = MessageBox.Show()
IIF()        = (boolean_condition ? "true" : "false")



'C# > 문법 및 기능' 카테고리의 다른 글

C# 변수 선언, 제어문과 자동완성 기능  (2) 2015.09.25
C# enum  (0) 2015.09.23
C# Controls  (0) 2015.09.18
C# TextBox 입력값(한글, 영문, 숫자) 검사, 엔터키 입력, readonly  (0) 2015.09.11
C# 콤보박스(comboBox)  (0) 2015.09.09
블로그 이미지

Link2Me

,

C# Controls

C#/문법 및 기능 2015. 9. 18. 15:29
728x90

VB.NET 과 C# 의 표현이 어떻게 다른지 알 수 있는 거 같아서 적어둔다.

'// Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   Dim MyText As New TextBox()
   MyText.Location = New Point(25, 25)
   Me.Controls.Add(MyText)
End Sub

// C# private void button1_Click(object sender, System.EventArgs e) { TextBox myText = new TextBox(); myText.Location = new Point(25,25); this.Controls.Add (myText); }


블로그 이미지

Link2Me

,
728x90

Regex 클래스를 사용하여 특정 문자 패턴을 찾는다.
Regex.Match() 메서드는 매치된 정보를 갖는 Match 클래스 객체를 리턴한다
매치된 문자열이 존재하면 Match.Success 속성이 True가 되고, Match.Index 속성을 통해 문자 패턴 위치를 알 수 있다.

string str = "서울시 서초구 양재동 우리아파트";
Regex regex = new Regex("우리");
Match m = regex.Match(str);
if (m.Success)
{
    Debug.WriteLine("{0}:{1}", m.Index, m.Value);
}


메타문자  의미
^        라인의 처음     
$        라인의 마지막   
\w       문자(영숫자) [a-zA-Z_0-9]
\s       Whitespace (공백,뉴라인,탭..)
\d       숫자
*        Zero 혹은 그 이상
+        하나 이상
?        Zero 혹은 하나
.        Newline을 제외한 한 문자
[ ]      가능한 문자들
[^ ]     가능하지 않은 문자들
[ - ]    가능 문자 범위
{n,m}    최소 n개, 최대 m개
(  )     그룹
|        논리 OR




//텍스트박스에 한글만 입력하기
using System.Globalization;
private void textBox1_TextChanged(object sender, EventArgs e)
{
    char[] inputchars = textBox1.Text.ToCharArray();
    var sb = new StringBuilder();
    foreach (var item in inputchars)
    {
        if (char.GetUnicodeCategory(item) == UnicodeCategory.OtherLetter)
        {
            sb.Append(item);
        }
    }
    textBox1.Text = sb.ToString().Trim();
}


// 한글입력이 아닌 경우 한글만 입력하라고 팝업창을 띄우고자 할 경우

private void textBox1_TextChanged(object sender, EventArgs e)
{
    char[] inputchars = textBox1.Text.ToCharArray();
    var sb = new StringBuilder();
    foreach (var item in inputchars)
    {
        if (char.GetUnicodeCategory(item) == UnicodeCategory.OtherLetter)
        {
            sb.Append(item);
        }
        else
        {
            MessageBox.Show("한글만 입력해주세요");
        }
    }
    textBox1.Text = sb.ToString().Trim();
}


//텍스트박스에 영어만 입력하기
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{   
    if(!(Char.IsLetter(e.KeyChar)) && e.KeyChar != 8)   
// 키값 8번은 백스페이스 값   

    {       

         e.Handled = true;   
    }
}

private void textBox1_Leave(object sender, System.EventArgs e)
{   
    Regex regex = new Regex(@"[a-zA-Z]");   
    Boolean ismatch = regex.IsMatch(textBox1.Text);   
    if (!ismatch)   
    {       
        MessageBox.Show("영문자만 입력해 주세요.");   
    }
}

//텍스트박스에 숫자만 입력하기
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{   
    if(!(Char.IsDigit(e.KeyChar)) && e.KeyChar != 8)   
    {       
        e.Handled = true;   
    }
}

private void textBox1_Leave(object sender, System.EventArgs e)
{   
    Regex regex = new Regex(@"[0-9]");   
    Boolean ismatch = regex.IsMatch(textBox1.Text);   
    if (!ismatch)   
    {       
        MessageBox.Show("숫자만 입력해 주세요.");   
    }
}


private void textBox1_Leave(object sender, System.EventArgs e)
{
    Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"); // 이메일
    Boolean ismatch = regex.IsMatch(textBox1.Text);
    if (!ismatch)
    {
        MessageBox.Show("E-Mail 형식만 가능합니다");
    }
}



텍스트박스 입력을 하고 엔터키가 눌려졌을 경우

private void SearchBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        btnMovieSearch_Click(sender, e);
    }
}


private void btnMovieSearch_Click(object sender, EventArgs e)
{
    if (this.SearchBox.Text == "")
    {
        MessageBox.Show("검색어를 입력하세요", "알림", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        this.SearchBox.Focus();
    }
    else
    {
        string url = string.Format("http://movie.naver.com/movie/search/result.nhn?query={0}&section=all&ie=utf8", SearchBox.Text.Trim());
        System.Diagnostics.Process.Start(url);
    }
}


텍스트박스 속성을 읽기전용으로 하고 싶은 경우

textBox1.ReadOnly = true;
textBox1.BackColor = System.Drawing.SystemColors.Window; // 배경색이 다르게 보이지 않도록 처리


텍스트박스에 커서가 맨마지막 글자위에 움직이게 하고 싶은 경우

textBox1.Focus(); // 선택하고
textBox1.SelectionStart = textBox1.Text.Length; // 글자의 마지막을 선택
textBox1.ScrollToCaret(); // 선택된 위치에 스크롤을 움직인다




'C# > 문법 및 기능' 카테고리의 다른 글

C# 과 VB 문법 차이  (0) 2015.09.22
C# Controls  (0) 2015.09.18
C# 콤보박스(comboBox)  (0) 2015.09.09
C# 키 입력처리 이벤트, Load Event, Form_Closing  (0) 2015.08.30
C# 정규식을 이용한 문자열 체크  (0) 2015.08.25
블로그 이미지

Link2Me

,
728x90

combobox 컨트롤은 여러개의 아이템 중에서 하나를 고를때 선택한다.



도구상자에서 comboBox 를 추가하면 default 는 DropDown 이 선택된다. 직접 변경하려면 DropDownStyle이라는 속성에서 지정한다.


private void AddComboBox() // 콤보박스에 추가
{  
   comboBox1.Items.Add(textBox1.Text); // 항목을 추가
 
   if (comboBox1.Items.Count > 0) // 항목이 있으면, 방금 입력한 항목을 선택
      comboBox1.SelectedIndex = comboBox1.Items.Count - 1;
}

private void GetComboBox()  // 콤보박스 선택을 TextBox1 에 표시
{
   textBox1.Text = comboBox1.SelectedItem.ToString();
}


private void Form1_Load(object sender, EventArgs e)
 {
       comboBox1.Items.Add("Item 1");
       comboBox1.Items.Clear();
        comboBox1.Items.AddRange(new string[] { "나미", "현숙", "효린" });
 }


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (comboBox1.SelectedIndex >= 0)  // index 는 0 부터 시작됨
    {
          cate1.Text = comboBox1.SelectedItem.ToString();  // SelectedItem 은 선택된 값
          textBox1.Text = comboBox1.SelectedIndex.ToString();  // Index 는 0, 1, 2
          MessageBox.Show(comboBox1.SelectedItem.ToString());
     }
}




comboBox1을 선택하면 comboBox2 의 값이 변하게 하는 방법을 알아보자.

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{           
     if (comboBox1.SelectedIndex >= 0)  // index 는 0 부터 시작됨
     {
          cate1.Text = comboBox1.SelectedItem.ToString();
          textBox1.Text = comboBox1.SelectedIndex.ToString();
      }
      if (comboBox1.SelectedIndex == 0)
      {
           comboBox2.Items.Clear();
           comboBox2.Items.Add("A1");
           comboBox2.Items.Add("A2");
           comboBox2.Items.Add("A3");
      }
      else if (comboBox1.SelectedIndex == 1)
      {
           comboBox2.Items.Clear();
           comboBox2.Items.Add("B1");
           comboBox2.Items.Add("B2");
           comboBox2.Items.Add("B3");
      }
      else if (comboBox1.SelectedIndex == 2)
      {
           comboBox2.Items.Clear();
           comboBox2.Items.Add("C1");
           comboBox2.Items.Add("C2");
      }
}





블로그 이미지

Link2Me

,
728x90

키를 입력하면 반응하는 이벤트 처리하는 방법이다.

소스코드 화면에 있다면 Shift + F7 키를 눌러서 폼 디자이너로 돌아가 폼을 선택한다.

적용할 속성창을 먼저 선택한다.



2번이 이벤트를 처리하는 곳이다. 알파벳순으로 보려면 이벤트 버튼 누르고 나서 A-Z 버튼을 누르면 된다.



더블클릭하고 나면 아래와 같이 화면에 적용되면서 곧바로 코드 입력창이 나온다.



if (e.KeyCode == Keys.Enter)  // 엔터키가 눌려졌으면
{
       btnSearch_Click(sender, e);
}


를 추가해준다.



프로그램이 실행될 때 객체와 폼이 생성되어 처음 표시되기전에 발생하는 Load 이벤트는 딱 한번만 호출된다.

호출 순서는 생성자가 우선이다. 생성자가 먼저 호출되어 일단 객체로서의 초기화를 수행하고 이어서 폼이 화면에 나타나기 전에 Load 이벤트가 전달되어 폼으로의 초기화를 수행한다. 



private void MainForm_Load(object sender, EventArgs e)
{
    // 데이터베이스에서 테이블 정보 가져오기
    ds = GetAllItems();
}


FormClosing 이벤트는 폼이 종료되기 전에 발생하며, FormClosing 이벤트를 받았을 때는 아직 폼이 종료된 것이 아니므로 이 단계에서 종료를 취소할 수도 있다.

하지만, FormClosed 이벤트는 미 저장 문서가 있다고 하더라도 종료를 취소할 수는 없다.

폼에 자식 폼 또는 소유되는 폼이 있는 경우에는 각 폼에 대해서도 FormClosing 이벤트가 발생한다.
폼 중 하나에서 이 이벤트를 취소하면 모든 폼이 닫히지 않는다. 따라서 모든 폼에 해당 FormClosed 이벤트가 보내지지 않는다.

FormClosingEventArgs 클래스는 이 이벤트에 대한 데이터를 제공한다. 두 개의 중요한 멤버는 Cancel 및 CloseReason 속성이다.
Cancel 속성을 true로 설정하면 이 이벤트를 취소할 수 있다. CloseReason 속성은 폼을 닫는 이유를 제공한다.


private void MainForm_Load(object sender, EventArgs e)
{
    frmLogin f2 = new frmLogin();  // 클래스 이름
    f2.ShowDialog();  //로그인 폼
    if (f2.getID == null)  // 로그인 폼에서 전달받은 ID 정보가 없으면
    {
        Application.Exit();
    }
    else
    {
        this.Text = "Service  " + f2.getID;
        this.WindowState = FormWindowState.Maximized;
        // 데이터베이스에서 테이블 정보 가져오기
}


이처럼 이벤트는 클래스내에 특정한 일(event)이 있어났음을 외부의 이벤트 가입자(subscriber)에게 알려주는 기능을 하며 코딩시 자주 사용한다.


블로그 이미지

Link2Me

,
728x90

출처 : http://tit99hds.egloos.com/2328190


회원 가입시, ID나 PWD, 혹은 다른 사용자가 입력한 값들에 대해 유효한 문자열인지를 체크하는 일이 발생한다.
보통 일반적으로 black-list 방식으로 처리하는 일이 많은데 이런 경우 특수 문자나 black-list에 없는 문자열이 포함될 경우 처리할 수가 없다.
즉, 정확한 유효성을 검증하기 위해 white-list로 처리해야 하는데 정규식을 이용하면 쉽게 처리할 수 있다.

/// <summary>

/// 정규식 조건에 맞는 문자열인지 체크합니다.

/// </summary>

/// <param name="type">1 : 숫자, 2 : 영문자, 3 : 한글, 4 : 숫자+영문자,
///                             5 :
숫자+영문자+한자, 6 : 숫자+영문자+한자+한글</param>

/// <param name="plainText">문자열</param>

/// <returns></returns>

public static bool IsRegexMatch(int type, string plainText)

{

           Regex rx;

 

           switch (type)

           {

                     case 1 :

                                rx = new Regex(@"^[0-9]*$", RegexOptions.None);

                                break;

                     case 2 :

                                rx = new Regex(@"^[a-zA-Z]*$", RegexOptions.None);

                                break;

                     case 3:

                                rx = new Regex(@"^[-]*$", RegexOptions.None);

                                break;

                     case 4:

                                rx = new Regex(@"^[a-zA-Z0-9]*$", RegexOptions.None);

                                break;

                     case 5:

                                rx = new Regex(@"^[a-zA-Z0-9-龥]*$", RegexOptions.None);

                                break;

                     case 6:

                                rx = new Regex(@"^[a-zA-Z0-9--龥]*$", RegexOptions.None);

                                break;

                     default :

                                return false;

           }

 

           return (string.IsNullOrEmpty(plainText)) ? false : rx.IsMatch(plainText);

}



블로그 이미지

Link2Me

,
728x90
C# 기본 이해를 위해 기초를 파악하는 중이다. C# 문법지식은 필요한 것만 기록해두려고 한다.

문법지식은 개발 언어가 다르다고 해서 별반 차이가 없고, 약간씩 표현하는 형식만 조금 다를 뿐이다.


비주얼 스튜디오에서 새 프로젝트를 생성하면 IDE 에서는 아래 파일을 생성한다.

Form1.cs  : 폼의 행동을 정의해주는 C# 코드가 들어간다

Form1.Designer.cs : 폼과 그 객체를 정의하는 코드가 들어간다.

Program.cs : 프로그램을 시작하고 폼을 표시하는 코드가 들어간다.


솔루션 탐색기에서는 프로젝트에 있는 모든 것을 보여준다.

Form1.cs 위에서 마우스 우클릭하고 코드보기(F7)을 누르면 코드들이 보인다.

솔루션 탐색기에서 파일명을 수정할 수 있다. 속성창에 .(Name) 이라고 적힌 부분을 수정하면 폼 이름이 바뀐다. 속성창이 화면에 보이지 않으면 F4 단축키를 사용하면 된다.


Form1.cs [디자인] 화면에서 UI 구성을 하고 소스보기를 하려면 F7 키를 누르면 소스보기 상태로 변경된다.

namespace 에는 프로젝트명이 기록된다.


모양을 가진 클래스 파일(Form, 사용자정의컨트롤)은 *.cs와 *.designer.cs 로 구성된다
Form1.cs, Form1.Designer.cs 로 이루어 진다.
Form1.designer.cs는 Visual Studio가 자동으로 코드를 구성해준다.


Form 디자인에서 이벤트를 선택하여 더블클릭하면, Form1.cs 파일에
private void button1_Click(object sender, EventArgs e)
{
   코딩하는 영역
}
가 생성됨과 동시에
Form1.desinger.cs 파일에
 this.button1.Click += new System.EventHandler(this.button1_Click);
가 자동으로 추가된다.
만약 Form1.cs 파일에서 직접 코드만 추가하면 Form1.desinger.cs 파일에는 자동으로 이 코드가 추가되지 않아 이벤트가 동작하지 않는다. (이벤트 동작 관련 처리 방법 http://link2me.tistory.com/783 참조 -- 중요)



InitializeComponent 메서드는 Form1.designer.cs 에 정의되어 있으며, 우리가 디자인한 화면을 표시할 수 있도록 관련 코드를 Visual studio가 자동으로 작성한다.


클래스(class)

Form1도 클래스의 일종이다
클래스는 생성자, 필드, 속성(프로퍼티), 메서드, 이벤트, 소멸자로 구성된다
생성자란 클래스안에 구성된 메서드의 특수한 형태이다.
Form() 생성자는 메서드 형태를 띠고 있으면서 public 접근 권한을 가지며, 반환형 자체가 없다
처음 메모리에 만들어질 때 딱 한 번만 실행된다
Form_Load()는 폼이 가지고 있는 여러개의 이벤트 중에 Load시에 발생하는 이벤트다.


클래스(class)는 새로운 데이터 타입을 만드는 데이터 타입 생성기이다.

구조체는 값 타입이고 클래스는 참조(Reference) 타입이다.

구조체는 타입이 다른 변수들의 집합이다.

배열은 동일한 타입의 변수들을 하나의 이름으로 묶어놓은 것이다.

Struct 구조체이름 {

   멤버 이름

}


class Person {   // Person : 클래스로 만들어진 새로운 데이터 타입
    public int age;  // Person 클래스 내부의 멤버 필드
    public long height;
    public float weight;
} //class



참조(Reference) 타입으로 변수를 선언하면 참조변수에 해당하는 메모리만 생성된다.

Person sister;  // 참조 변수의 선언(참조변수에 해당하는 메모리만 생성)

실제 메모리는 new 연산자를 이용해서 생성해주어야 한다.

sister = new Person();  // 실제 메모리 생성


Person sister = new Person(); // 동시에 객체 변수선언 및 메모리 생성


private을 사용하는 이유 : 클래스 내부에서만 사용하기 위해서다.

즉, 멤버들에 대한 접근을 해당 클래스 내에서만 가능하도록 할 때 사용하는 접근자이다.

string name;  // 앞에 아무것도 붙이지 않는 것은 private 로 선언되었음을 의미


public 은 어느 클래스, 객체에서건 접근이 가능하도록 할 때 사용하는 접근 변경자이다.

protected 된 클래스 멤버는 정의된 클래스 내에서와 파생클래스 인스턴스에서 접근이 가능하다.

protected int age = 20;  // 파생 클래스에서 접근 가능한 멤버

  * 파생클래스 : 정의된 클래스로부터 상속받은 클래스

     상위 클래스를 기본 클래스(Base Class) 라고 하며,

     하위 클래스(Sub Class)를 파생 클래스(Derived Class)라고 한다.

     상속(Inheritance)를 하면 상위 클래스의 능력을 하위 클래스에서 모두 이용할 수 있다.

     class Person : Form  // Form 클래스로부터 상속( : ) 받았음을 의미


기본 클래스 멤버 숨기기

파생 클래스는 기본적으로 상속받은 멤버들을 삭제할 수 없다. 숨기기는 가능하다.

동일한 입력 파라미터를 가지고 앞에 new 키워드를 붙여주면 된다.

new public string name = "학생";


public sealed class Parent   // sealed 는 상속 금지 키워드

{

}


C# 에서는 new 를 사용해서 메모리를 생성했지만 별도로 메모리를 제거 하지 않아도 된다.

이유는 가비지 콜렉터(Garbage Collector)가 있어 알아서 메모리를 제거 해준다.

닷넷 라이브러리에 가비지 컬렉터(쓰레기 수집기)가 주기적으로 힙을 검사하여 더이상 참조되지 않는 메모리들을  자동으로 해제한다.

C++ 에서는 메모리를 생성했으면 반드시 사용자가 직접 delete를 사용해서 메모리를 제거해주어야 한다.


using System;

namespace Data {  // 특정 구간의 이름을 Data 로 하겠다
    public class HelloWorld

    {
        public static void Main()    // 실행 프로그램은 하나의 Main()을 포함해야 한다

        {

             Console.WriteLine("Hello World!");
        } // main
    } // class
}


어떤 class 가 public 으로 선언되어 있으면 그 프로그램에 있는 어떤 class 에서든 그 메소드에 접근할 수 있다.

Main은 객체가 생성되기 전에 호출되어야 하므로 반드시 static 이어야 하며 외부에서 호출되므로 public 액세스 지정을 가져야 한다.

C#에서는 Main 함수가 class에 소속되는 멤버이기 때문에 여러개의 class가 각각의 메인을 갖는 것은 가능하지만 2개 이상이면 진입점이 어디인지를 명시해줘야 한다. 진입점을 명시해주지 않으면 에러가 난다. 따라서 가급적이면 Main 은 하나만 사용하는 것이 좋다.


하나의 파일에 하나 또는 둘 이상의 클래스를 생성하는 것은 가능하지만,
반대로 하나의 클래스를 여러 개의 파일에 나누어 생성하는 것은 가능할까? 결론은 가능하다.

한 class 를 여러 파일에 나눠서 선언할 때는 반드시 partial 키워드를 사용해야 한다.
partial class란 동일한 클래스를 여러 파일에 분리하여 개발가능하도록 구현된 기술이다
partial class는 CLR 수준이 아닌 C# Compiler 수준에서 처리되므로 많은 partial class를 만들어도 실제 컴파일시에 하나의 클래스로 수집하여 인식하므로 단일 코드로 취합한다.


파일명은 _ABC.cs, _ABC.Movie.cs, _ABC.Image.cs, _ABC.Voice.cs 처럼 다르게 정하면 되지만

namespace, class명을 동일하게 맞춰줘야 하고 클래스 부분 앞에 partial 이라고 붙여줘야 한다


namespace Data
{
    public partial class _ABC
    {
        //내용
    }
}

// _ABC 클래스의 일부
public partial class _ABC : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.Button1.Click += delegate
        {
            Response.Write("Button1_Click1");
        };
    }
}

// _ABC 클래스의 일부
public partial class _ABC
{
    protected void Button2_Click(object sender, EventArgs e)
    {
        Response.Write("Button2_Click2");
    }
}


.NET Framework 은 무수하게 많은 클래스들을 가지고 있는데, 예를 들면 .NET 4.0은 약 11,000개의 클래스를 가지고 있다. 이렇게 많은 클래스들을 충돌없이 보다 편리하게 관리/사용하기 위해 .NET에서 네임스페이스를 사용한다.

.NET 라이브러리를 제대로 활용하기 위해서는 네임스페이스와  using 문에 대해 우선적으로 이해해야 한다.



C#에서도 이러한 개념을 적용하여Class 들이 Namespace 안에서 정의된다.

CLR 은 메모리, 자원관리, Thread 와 같은 핵심서비스들을 구현하려는 프로그램에 제공한다.

MS가 기본 제공하는 일종의 함수들을 불러서 편하게 사용하면 복잡한 부분에 대한 코드를 고민하면서 코딩을 안해도 되므로 구현하고자 하는 핵심사항만 구현하면 되므로 훨씬 빠르게 코딩이 가능하다.


보기 - 개체브라우저 선택하고 System.IO 네임스페이스에 정의되어 있는걸 확인할 수 있다.


//첫번째 방식 static void Main(string[] args) {     System.Console.WriteLine(); } //두번째 방식, using 선언문은 C#한테 어떤 닷넷 프레임워크를 사용할지 알려주는 역할을 한다. using System; //System 네임스페이스 지정 static void Main(string[] args) {     Console.WriteLine(); }


// using 다음에 참조할 네임스페이스명을 적으면 컴파일러가 using 선언된 네임스페이스를 항상 참조한다.

// using 은 대문자로 쓰면 안된다. using 선언문은 C#한테 어떤 프레임워크를 사용할지 알려주는 역할을 한다.

// using 선언은 꼭 필요한 것들만 선언하는 것이 좋다.

using System; // System 네임스페이스 안에 정의된 클래스들을 사용할 것이므로 준비하라는 지시사항

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windwos.Forms;


MessageBox 는 System.Windows.Forms 라는 이름공간(namespace)에 속한 클래스다.


Console.WriteLine("당신의 이름은 : {0}, 나이는 {1}  입니다", 홍길동, 30);

// {0} 은 치환 표시자 : 홍길동을 전달받아 문자열 출력시 출력

// {1} 은 30을 전달받아 문자열 출력시 출력

// 치환표시자는 0 부터 시작해서 1씩 증가



C#의 조건문/반복문(if, for, while)의 조건식은 반드시 논리형(bool)이어야 한다.

while 문은 조건식에 의해서만 반복 수행이 결정된다.

for 문은 초기화, 조건식, Step 3가지로 나뉘어진다.

- 정해진 횟수만큼 반복적으로 수행할 때 for문을 사용한다.

- 한계나 범위가 주어져 있을 때는 for문을 사용한다.

- 특정 조건에만 반복 수행할 때에는 while 문을 사용한다.



foreach 문

foreach 문은 배열(Array)이나 컬렉션(Collection) 내에 존재하는 각 요소들에 대해 접근할 수 있게 해주는 제어문으로 비주얼베이직에서 가져온 문법이다

foreach 문을 사용한 배열의 특징
- 메모리에 저장된 순서대로 요소 값을 읽어낸다.
- 반복변수는 오직 읽기전용으로 사용


논리연산자는 불필요한 조건을 점검하지 않는 Short Circuit 기능을 제공한다.

if (a && b) 조건문에서 a 가 거짓이면 b는 검사하지 않는다.

if ( a || b) 조건문에서 a 가 참이면 b는 검사하지 않는다.



배열

타입[] 변수명;  // 배열 요소를 저장하기 위한 메모리까지 할당하는 것은 아니다.

배열은 참조형(reference type) 이므로 변수 자체가 실제 데이터를 저장하지 않는다.

배열을 포함한 모든 참조형은 new 연산자로 실제 메모리를 할당 받아야 한다.

배열은 할당만 할 뿐 일부러 해제할 필요는 없다.


string[] strMemberArray = smember.split('/')

// 데이터타입[] 변수이름

foreach (string smember in strMemberArray)

{

}

// 엑셀 VBA 에서 Split 함수는 Split(C,"/") 이런식인데 C#에서는 C.split('/') 로 표현하는게 조금 다름

C#에서 기본적으로 제공하는 Split 함수는 문장을 구분자로 둘 수가 없다.

따라서 문장을 smember.Replace("aaa","/"); 와 같이 특정 문자열로 대체한 뒤에 split 함수를 사용하면 된다.


DataGridView 의 속성 정보는 https://msdn.microsoft.com/ko-kr/library/3dyct1w0.aspx 를 참조하면 된다.

DataGridView 컨트롤에서는 데이터를 표 형식으로 표시하고 편집할 수 있다.


코드창에서 알고 싶은 내용에 대해 F1키를 누르거나 MSDN을 별도로 띄워 목차, 색인 등을 활용하면 궁금한 내용뿐만 아니라 주변지식이나 참고사항, 예제까지도 볼 수 있다.


밖으로 데이터를 내보내기할 때에는 함수의 Return 을 통해서 외부로 값을 복사한다.


List 객체를 생성할 때는 반드시 유형(int, string, bool 등)을 지정해 줘야 한다.

List <T> name = new List <T>();


블로그 이미지

Link2Me

,