728x90

원하는 칼럼에 자동 번호 매기는 소스를 열심히 찾아봤더니 모 블로그에 나온 것은 오직 첫번째 칼럼에만 Numbering 이 된다.


구글링을 해봤더니 간단한 소스가 검색된다.


private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
      // 원하는 칼럼에 자동 번호 매기기
      this.dataGridView1.Rows[e.RowIndex].Cells[1].Value = (e.RowIndex + 1).ToString();          
}





블로그 이미지

Link2Me

,
728x90

dataGridView 의 각 Row를 선택할 때 칼럼의 값을 Textbox 에 보여주도록 하려면 어떻게 해야 할까?



나같은 초보자는 아래 코드를 어떻게 만드는지를 모른다.

dataGridView1 의 속성 Event 창에서 더블클릭하면 자동으로 코드를 채울 수 있게 만들어진다.

필요한 코드만 직접 작성하면 된다.


//셀 내용 읽기 1행, 0열  --> 행은 Rows, 열은 Column 이 아니라 Cells 로 표기하네

dataGridView1.Rows[1].Cells[0].Value.ToString();



private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    textBox1.Text = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();
    textBox2.Text = dataGridView1.Rows[e.RowIndex].Cells[4].Value.ToString();
    textBox3.Text = dataGridView1.Rows[e.RowIndex].Cells[5].Value.ToString();
    textBox4.Text = dataGridView1.Rows[e.RowIndex].Cells[6].Value.ToString();

    if (e.ColumnIndex == 2)  // 3번째 칼럼이 선택되면....
    {
        MessageBox.Show((e.RowIndex + 1) + "  Row  " + (e.ColumnIndex + 1) + "  Column button clicked ");
    }
}



만약, 외국 사이트, 블로그 등에 나온 자료를 보고 사용자 소스코드에 붙여넣기를 한 경우에는

디자이너 소스 파일에는 기록이 안되어 있다. 그러므로 Event 연결을 해줘야 한다.

위의 코드를 보면 CellClick 이라고 보일 것이다.

바로 이 부분을 연결하기 위해서 Shift + F7 키를 눌러서 WindowsForm 화면으로 이동한 다음에

dataGridView1 을 마우스로 선택하고 나서 속성창에서 Event 를 클릭한 다음에 CellClick 이벤트를 찾는다.



이렇게 해주면 연결되어 동작이 된다.


글 쓰려고 테스트한다고 2번을 빈칸으로 지웠더니 CellClick 이벤트 소스 코드가 삭제되어 버렸다.

혹시 이런 증상이 생길지 모르니 소스코드는 EditPlus 같은 텍스트편집기에 복사를 해주는게 좋다.

블로그 이미지

Link2Me

,
728x90

인터넷 열심히 뒤지면서 알아내고 직접 테스트해본 걸 적어둔다.

일단 인터넷 검색을 하다보면 DataGridView1 라고 나온 것이 있는데, C#은 대문자, 소문자를 구분하기 때문에 dataGridView1 이라고 정확하게 적어줘야 에러가 발생하지 않는다.


엑셀 셀처럼 편집하는 기능으로 보이는데 기능을 제대로 파악하려면 아직 한참더 찾아보고 테스트를  해봐야할 거 같다.

자료의 내용은 개발 시험을 하면서 새롭게 알게된 것은 지속적으로 업데이트를 하고 있다.

마지막 업데이트 : 2015.9.7


//Fill grid with items
dataGridView1.DataSource = DS.Tables[0]; //바인딩부분


dataGridView1.RowHeadersVisible = false;  // 행 헤더 숨기기
//dataGridView1.BorderStyle = BorderStyle.Fixed3D;

dataGridView1.Columns[4].HeaderText = "가격";  // HeaderText(제목) 칼럼명 지정
dataGridView1.Columns[5].HeaderText = "수량";
//dataGridView1.Columns[6].Visible = false; // 화면에 보여주고 싶지 않은 칼럼 지정

// Header 가운데 맞춤
dataGridView1.Columns[0].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Columns[1].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Columns[2].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Columns[3].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Columns[4].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Columns[5].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Columns[6].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
// 칼럼(열)의 수보다 많으면 Index 에러가 발생한다는 메시지를 보여줌


// 내용 가운데 맞춤
dataGridView1.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView1.Columns["uid"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;


//dataGridView1.CurrentCell = null;
dataGridView1.AllowUserToOrderColumns = true;  // Column 별로 Sort 및 열 순서 변경 가능
// 열의 순서를 변경해도 MySQL 테이블에는 정상적으로 데이터가 저장됨
dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable; // Column 정렬(Sort) 못하게
dataGridView1.Columns[2].SortMode = DataGridViewColumnSortMode.NotSortable;

// Read Only Columns and Rows
//dataGridView1.ReadOnly = true;  // 모든 칼럼을 읽기 전용으로 만들기 때문에 특정 칼럼만 수정 불가
dataGridView1.Columns[2].ReadOnly = true; // 특정 칼럼 읽기 전용으로 적용하기
dataGridView1.Columns[3].ReadOnly = true;
dataGridView1.Columns[4].ReadOnly = true;
dataGridView1.Columns[6].ReadOnly = true;

dataGridView1.AllowUserToResizeColumns = false; // Header Column 너비 조정
//dataGridView1.Columns[1].Visible = false; // 칼럼(열) 숨기기
//dataGridView1.RowTemplate.Height = 35; // 셀 높이 결정


dataGridView1.AllowUserToAddRows = false;  // 빈레코드 표시 안하기

빈 여백없이 화면에 출력되도록 하려면

dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

dataGridView1.AutoResizeColumns();  // 각 열의 데이터에 맞게 자동으로 사이즈를 조절


// 칼럼 출력 자동 맞추기
dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
dataGridView1.Columns[4].DefaultCellStyle.Format = "###,##0";  // 숫자표시 칼럼


칼럼에 따라 너비를 고정으로 하고 싶은 경우가 있다.

dataGridView1.Columns[0].Width = 50;  // Header 너비 수동 설정

처럼 Column 너비만 고정으로 했더니 화면 해상도에 따라 자동으로 크기가 변한다.

칼럼 크기를 완전히 고정하려면

dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
dataGridView1.Columns[1].Width = 70;

이 두개를 같이 적어줘야 모니터 해상도와 관계없이 고정적으로 변하지 않는다.

칼럼명은 숫자보다 직접 칼럼명을 적어주는 것이 좋다.

dataGridView1.Columns["cate1"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

dataGridView1.Columns["cate1"].Width = 70;

나머지 칼럼은 해상도에 따라 적정하게 채워주면 된다.

private void getScreenResolution()
{
     int screenWidth = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
     int screenHeight = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
}

private void setAutoSizeColumnsMode()
{
     if (screenWidth <= 1680 || screenHeight  <= 768)
         dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
     else
         dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}



// 그리드 셀 배경색 지정
//dataGridView1.Columns[0].DefaultCellStyle.BackColor = Color.FromArgb(240, 240, 240);
//dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.LightCyan;
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;


private void btn_CellUpdate_Click(object sender, EventArgs e)
{
    // 선택한 셀의 타입 알아보기
    if (typeof(Int32) == dataGridView1.SelectedCells[0].Value.GetType())
    {
        MessageBox.Show("dataGridView1 Cell Value is 숫자");
    }
    else if (typeof(string) == dataGridView1.SelectedCells[0].Value.GetType())
    {
        MessageBox.Show("dataGridView1 Cell Value is 문자열 ");
    }
    else
    {
        MessageBox.Show(dataGridView1.SelectedCells[0].Value.GetType().ToString());
    }
}


마우스 오버 상태에서 highlight 표시 처리

int OldRow = 0;
private void dataGridView1_MouseMove(object sender, MouseEventArgs e)
{
    DataGridView.HitTestInfo hti = dataGridView1.HitTest(e.X, e.Y);

    if (hti.RowIndex >= 0 && hti.RowIndex != OldRow)
    {
        dataGridView1.Rows[OldRow].Selected = false;
        dataGridView1.Rows[hti.RowIndex].Selected = true;
        OldRow = hti.RowIndex;
    }
}

블로그 이미지

Link2Me

,
728x90

인터넷에서 소스파일을 수정 좀 해보면서 .Name 값을 변경을 해봤다.



Designer.cs 파일에서 내용이 자동으로 변경된다.


더블클릭한 이름도 같이 변경되는 줄 알았더니 이건 변경이 안된다.

소스창에서 직접 수정을 해봤다.




메뉴 구조의 이름을 본인의 입맛에 맞게 변경하기 위해서 해봤다.

.Name 이름만 변경하면 기존에 이미 생성되었던 Click Event 도 자동으로 이름이 변경될 줄 알았는데 그렇게 안되어 일일히 수작업 수정을 해야 했다.


내가 잘 모르는 뭔가가 있는지 아직은 모르겠다.

'C# > Visual Studio' 카테고리의 다른 글

C# statusStrip 메뉴  (2) 2015.09.10
What's New in C# 6.0  (0) 2015.09.05
C# 윈도우폼(로그인폼) 실행 팁 배우기  (0) 2015.08.17
C# 윈도우폼 ContextMenu 만들기  (0) 2015.08.02
C# 윈도우 실행폼 메뉴 만들기  (0) 2015.07.30
블로그 이미지

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

,

C# 과 MySQL 연동

C#/C# SQL 2015. 8. 29. 00:30
728x90

책보고 네이버/구글 폭풍검색하다보니 좀 정리가 되는거 같다.

도식화된 그림은 구글 이미지 검색해서 찾았다.


C#에서 데이터베이스에 연결하는 방법은 세가지 방법이 있다.

ㅇ C# 과 DB 직접 접속방식 (기업 내부에 서버가 있는 경우)

   - 연결형으로 데이터베이스 사용하기

   - 비연결형으로 데이터베이스 사용하기

ㅇ C# 과 DB 간접 접속방식

   - C# - PHP(JSP, ASP) - DB (보안문제 해결)


아래 설명은 DB 직접 접속방식에 대한 설명이다.

SQL 연결방식은 SQL Server, MySQL, Oracle 등 모두 동일한 방식으로 제공하고 있다.

어떤 DB에 접속하는지 식별할 수 있게 하는 것만 다르다.



C# 과 MySQL 을 연동하기 위해서 가장 먼저 해야 할 일은 아래의 네임스페이스들을 참조해야 한다.

using System.Data;  // DB처리 관련된 일반 클래스

//Include mysql client namespace.
using MySql.Data.MySqlClient;
using System.Configuration;

* 연결하는 DB에 따라 참조하는 네임스페이스는 달라진다.


Mysql 데이터 연결
MySQL 데이타베이스를 연결하기 위해서는 MySqlConnection 클래스를 사용한다.

//Read connection string from application settings file (데이터베이스 연결)
string  ConnectionString = ConfigurationSettings.AppSettings["ConnectionString"];  // DB 연결 정보

MySqlConnection myConn// 보통 Conn 으로 표현되어 있고, AccessConn 은 액세스 연결, myConn 은 MySQL 연결
myConn = new MySqlConnection(ConnectionString);

MySQL 데이터를 C# 으로 가져오기 위해서는

MySqlCommand / MySqlDataReader (연결형 데이터베이스 사용)

또는 

MySqlCommand / MySqlDataAdapter (비연결형 데이터베이스 사용)

를 사용한다.



1. 연결형으로 데이터베이스 사용하기


MySqlCommand 는 모든 SQL 구문을 실행시켜 주는 담당 객체 (select, update, delete, insert, create, drop 등)

string sql = "select * from TableName where 조건";
MySqlCommand cmd = new MySqlCommand(sql, myConn);

MySqlDataReader는 연결모드로 데이터를 서버에서 가져온다.

Query 문에서 어떠한 값이 리턴 될지 모르기 때문에 Object형으로 반환된다.
따라서 반환값을 적절히 변환하여 사용해야 한다.
또한 Query의 결과 값이 여러 개의 행과 열을 가질 수 있는데, 이런 경우에는 첫 번째 행의 첫 번째 열의 값이 리턴된다.


ExecuteReader는 여러 개의 행과 열을 동시에 가져올 때 사용한다. 삽입, 삭제, 수정 등은 할 수 없다.

주로 Select 명령문을 실행하고 그 결과셋을 SqlDataReader 타입의 객체로 리턴한다.

string sql = "select * from items order by uid desc";
myConn.Open();  // mysql DB 연결
MySqlDataReader R = new MySqlCommand(sql, myConn).ExecuteReader();

* MySqlDataReader 는 record 단위로 접근하며, 하나의 reader 가 열려 있으면 또다른 reader는 열수가 없다.

while (R.Read())    // 칼럼을 배열처럼 사용하여 R[0]는 첫번째 칼럼,  R[1] 은 두번째칼럼
{   // R 은 한번에 하나의 레코드에만 접근 가능

    // R['uid'], R['name'] 으로 칼럼을 직접 명기할 수 있다.
    label1.text = R[0].ToString();  // string name = R.GetString(0);

    label2.text = R[1].ToString();
}
R.Close();   // 쿼리문 결과 닫기. reader 로 열였으면 반드시 닫아주어야 한다.
myConn.Close();  // mysql DB 연결 종료


ExecuteNonQuery는 결과를 받을 필요가 없는 Query문에 사용된다
보통 Insert문이나 Update문은 결과를 받을 필요가 없기 때문에, Insert, Update 문에서 많이 사용한다
위와 같은 Query에서는 몇 개행에 적용되었는지가 중요한데, ExecuteNonQuery는 적용된 행의 개수를 리턴해준다
string qry ="UPDATE items SET Quantity=10 WHERE uid='" + user_id +"'";
MySqlCommand cmd = new MySqlCommand(qry, myConn);
myConn.Open();
cmd.ExecuteNonQuery();
myConn.Close();

ExecuteScalar는 Query문에서 1개의 값을 가져올 때 사용한다.
결과가 딱 1개인 집계함수(count, sum, avg, max, min 등)에 사용한다.


2. 비연결형으로 데이터베이스 사용하기


비연결형의 핵심은 메모리에 구축된 DB인 DataSet 클래스이다. 메모리상의 오프라인 DB라고 할 수 있다.

SQL Server, Oracle, MySQL 같은 DBMS의 테이블은 물론이고 Excel Worksheet, XML 파일, 텍스트파일까지도 DataSet 에 넣어 놓고 관리할 수 있다. 단점은 대량의 데이터를 메모리에 계속 보유해야 하므로 Client(PC, 노트북)의 리소스를 엄청 소모할 수 있다.

MySqlDataReader는 연결모드로 데이터를 서버에서 가져오는 반면, (메모리 공간 별로 차지하지 않음)
MySqlDataAdapter는 한꺼번에 클라이언트 메모리로 데이터를 가져온 후 연결을 끊는다.

MySQL DB 와 연결이 끊어져 있어도 SQL 작업이 가능하다.

받은 전체 데이터(MySqlDataAdapter)는 주로 로컬에 있는 DataSet 객체 안에 메모리상의 테이블 형태로 존재하는데, 이를 각종 컨트롤들에게 바인딩 시킬 수 있다.


MySqlDataAdapter adapter;
string sql = "select * from items order by uid";
adapter = new MySqlDataAdapter(sql, myConn);
DataSet DS = new DataSet();
adapter.Fill(DS);

MySqlCommand 로 Update, Insert, Delete Query 문 처리하고

DS.Tables[0];


DataTable ds;

dataGridView1.DataSource = ds;  // DataSource 에 DataTable 객체를 대입하면 테이블이 표형식으로 출력


* 테이블의 실제 데이터를 저장하는 것은 Record(행)이며 행은 DataRow 클래스로 표현한다.


도움되었다고 생각되면 공감 꾸욱 눌러주세요.


블로그 이미지

Link2Me

,
728x90

홀수행과 짝수행의 배경색을 다르게 지정하는 방법이 아래 코드 한줄이면 된다.

dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;



아래와 같은 코드도 한 행씩 건너뛰면서 배경색상을 다르게 준다.

for (int i = 1; i < dataGridView1.Rows.Count; i++)
{
       if (i % 2 != 0)
       {
              dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(240, 255, 240);
        }
        else
        {
             dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.White;
        }
}


위 코드에서 Rows 대신에 Columns 를 하면 칼럼(column)의 배경색을 변경할 수 있다.

블로그 이미지

Link2Me

,
728x90

연결형 방식

DB에 접속하는 순서는

1. 서버에 연결

2. 서버에게 명령을 보내거나 프로시저를 호출해서 데이터를 달라고 요청 (SqlCommand)

3. 실행 메소드를 호출


ExecuteScalar : SQL 명령을 실행하고, Query 가 리턴하는 첫번째 행의 첫번째 열을 리턴한다.

결과가 딱 1개인 집계함수(count, sum, avg 등)에 사용한다.


MySqlCommand cnt = new MySqlCommand("select count(*)  from items", myConn);
myConn.Open();
int totalCount = Convert.ToInt32(cnt.ExecuteScalar());
totalcnt.Text = Convert.ToString(totalCount); // totalcnt 라는 label 에 값을 기록


테스트를 해보니 아래 3줄로 처리하니까 잘 된다.

MySqlCommand cnt = new MySqlCommand("select count(*)  from items", myConn);
myConn.Open();
totalcnt.Text = Convert.ToString(cnt.ExecuteScalar());


비연결형방식

adapter = new MySqlDataAdapter(strqry, myConn);
DataSet DS = new DataSet();  // DataSet 객체 생성
adapter.Fill(DS); // DS에 MySQL DB로부터 가져온 select * from items 의 결과물을 채우겠다.


// DB에서 가져온 총 Record 수

for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
{
       
totalcnt.Text = Convert.ToString(i);
 }

로 처리해 줄 수도 있다.


더 간단하게 총 레코드수를 확인하는 방법이 있더라.

// DB에서 가져온 총 Record 수

totalcnt.Text = DS.Tables[0].Rows.Count.ToString();


DS.Tables[0].Rows.Count 는 int 형이라서 레이블에 결과를 기록하려고 컴파일(F5)를 했더니 오류 메시지가 나온다.

그래서 뒤에 ToString을 붙여줬더니 OK





블로그 이미지

Link2Me

,
728x90

출처 : http://blog.daum.net/modong518/84


간단한것인데 어려웠다. 으헝헝헝

인터넷에 검색을 해서 제일 그럴듯하게 찾았던 것이 Form1 -> Form2를 전환하기위해서

버튼을 누르면 Form1을 숨기고 Form2를 보여주는 방식이었는데

윈도우 Form이 많아지면 많아질 수록 꽁수는 들통이 나게 되어있었다 ㅠ_ㅠ

 

답은 여기에 있다 !

 

곰곰히 생각해보니 Form1에서 Form2를 부르게 되는 것은 상속을 통해 호출하는 것과 같으니

Form1 클래스에 Form2 객체를 하나 만들고 Form2를 부르게 되는곳에서 생성하면서 Show()함수를 통해 보여주면 된다. 주의할것은 이 Show함수는 Form1의 Show함수가 아니라 Form2의 객체 이름.Show()함수이다. 

 

 this.form2 = new Form2(this);
this.form2.Show();

 

그리고 나서 또 주의할것은 이 Form2를 닫게 되면 Form1은 남아있다는 것이다. 함께 닫게 하기 위해서 필요한 것이 있는데 바로 상위 Form1에서의 선언이다.

객체를 만들고 보여주기 전에 다음과 같이 선언한다. 이는 Form2가 닫혀지는 이벤트가 발생시에 Form1의

exit_Click이벤트를 발생시킨다. exit_Click이벤트에서는 this.Close() 함수만 호출하면 폼이 닫혀진다.

 

 this.form2.FormClosed += new FormClosedEventHandler(exit_Click);

 

정말 나와 같이 헤매는 학생들에게 도움이 되었으면 좋겠다. 아악 ㅜㅜ 힘내자 +_+ !

 

블로그 이미지

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# 유투브 강좌 등을 보면서 배운 걸 간략하게 정리를 해두려고 한다.

내부 소스코드로 이동은 단축키 F7 --> Form1.cs

디자인 소스코드로 이동은 Shift+F7 --> Form1.cs [디자인]



ControlBox 속성을 false 로 변경하면 상단 X 버튼마저 보이지 않게 된다.




각 컨트롤을 선택 후 우클릭하여 속성(property)을 선택하여 해당 컨트롤의 속성을 변경할 수 있다.


ListView

도구상자 --> 공용 컨트롤 --> ListView


파일을 Drag & Drop 으로 끌어다가 놓을 때 동작이 가능하게 하는 옵션


Datagridview 창크기 조절하는 방법



상황에 따라

AutoSizeColumn: Fill

Dock: Fill 부분을 처리





'C# > Visual Studio' 카테고리의 다른 글

C# statusStrip 메뉴  (2) 2015.09.10
What's New in C# 6.0  (0) 2015.09.05
C# Name 명칭 변경  (0) 2015.09.02
C# 윈도우폼 ContextMenu 만들기  (0) 2015.08.02
C# 윈도우 실행폼 메뉴 만들기  (0) 2015.07.30
블로그 이미지

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

,
728x90

처 : http://choiwonwoo.egloos.com/669096


crypt-9352-bugsoda.cs최상단의 const string desKey는 DES암호화에 필요한 키데이터이고 이 키 값은 임의로 정의해서 쓰시면 됩니다. 이 키값은 암호화와 복호화에 쓰이게 되므로 유출될 시에 문제가 발생할 수 있겠죠. 

출처는.. 데브피아 같은데 까먹었습니다 -_- (죄송합니다.)
원본소스를 조금 수정한 버전이라 다를수도 있겠네요.

C#으로 작성된 소스이며, VS.NET에서는 기본적으로 암호화 함수를 지원하고 있습니다. 아래 코드는 이 암호화함수들을 사용하는 셈플이지요.

using System;
using System.Security;
using System.Security.Cryptography;
using System.Text;
using System.IO;

namespace Utility
{
/// <summary>
/// Crypt에 대한 요약 설명입니다.
/// </summary>
public class Crypt
{
// 암호화 키
private const string desKey="......";

public Crypt()
{
  //
  // TODO: 여기에 생성자 논리를 추가합니다.
  //
}

//------------------------------------------------------------------------
#region MD5 Hash

public static string MD5HashCrypt(string val)
{
  byte[] data = Convert.FromBase64String(val);
  // This is one implementation of the abstract class MD5.
  MD5 md5 = new MD5CryptoServiceProvider();
  byte[] result = md5.ComputeHash(data);

  return Convert.ToBase64String(result);
}

#endregion //MD5 Hash

//------------------------------------------------------------------------
#region DES암복호화

// Public Function
public static string DESEncrypt(string inStr)
{   
  return DesEncrypt(inStr,desKey);
}

//문자열 암호화
private static string DesEncrypt(string str,string key) 
{
  //키 유효성 검사
  byte[] btKey = ConvertStringToByteArrayA(key);

  //키가 8Byte가 아니면 예외발생
  if(btKey.Length!=8)
  {
   throw (new Exception("Invalid key. Key length must be 8 byte."));
  }

  //소스 문자열
  byte[] btSrc = ConvertStringToByteArray(str);
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
           
  des.Key = btKey;
  des.IV = btKey;

  ICryptoTransform desencrypt = des.CreateEncryptor();

  MemoryStream ms = new MemoryStream();

  CryptoStream cs = new CryptoStream(ms, desencrypt, 
   CryptoStreamMode.Write);

  cs.Write(btSrc, 0, btSrc.Length);
  cs.FlushFinalBlock();


  byte[] btEncData = ms.ToArray();

  return (ConvertByteArrayToStringB(btEncData));        
}//end of func DesEncrypt

// Public Function
public static string DESDecrypt(string inStr) // 복호화
{
  return DesDecrypt(inStr,desKey);
}

//문자열 복호화
private static string DesDecrypt(string str,string key) 
{
  //키 유효성 검사
  byte[] btKey = ConvertStringToByteArrayA(key);

  //키가 8Byte가 아니면 예외발생
  if(btKey.Length!=8)
  {
   throw (new Exception("Invalid key. Key length must be 8 byte."));
  }


  byte[] btEncData = ConvertStringToByteArrayB(str);
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();
           
  des.Key = btKey;
  des.IV = btKey;

  ICryptoTransform desdecrypt = des.CreateDecryptor();

  MemoryStream ms = new MemoryStream();

  CryptoStream cs = new CryptoStream(ms, desdecrypt, 
   CryptoStreamMode.Write);

  cs.Write(btEncData, 0, btEncData.Length);

  cs.FlushFinalBlock();

  byte[] btSrc = ms.ToArray();


  return (ConvertByteArrayToString(btSrc));
  
}//end of func DesDecrypt

//문자열->유니코드 바이트 배열
private static Byte[] ConvertStringToByteArray(String s)
{
  return (new UnicodeEncoding()).GetBytes(s);
}

//유니코드 바이트 배열->문자열
private static string ConvertByteArrayToString(byte[] b)
{
  return (new UnicodeEncoding()).GetString(b, 0, b.Length);
}

//문자열->안시 바이트 배열
private static Byte[] ConvertStringToByteArrayA(String s)
{
  return (new ASCIIEncoding()).GetBytes(s);
}

//안시 바이트 배열->문자열
private static string ConvertByteArrayToStringA(byte[] b)
{
  return (new ASCIIEncoding()).GetString(b, 0, b.Length);
}

//문자열->Base64 바이트 배열
private static Byte[] ConvertStringToByteArrayB(String s)
{
  return Convert.FromBase64String(s);
}

//Base64 바이트 배열->문자열
private static string ConvertByteArrayToStringB(byte[] b)
{
  return Convert.ToBase64String(b);
}

#endregion //DES암복호화

//------------------------------------------------------------------------
#region RSA암복호화
//RSA 암호화
public static string RSAEncrypt(string sValue,string sPubKey)
{
  //공개키 생성
  byte [] keybuf = Convert.FromBase64String(sPubKey);
  sPubKey =  (new UTF8Encoding()).GetString(keybuf);
  System.Security.Cryptography.RSACryptoServiceProvider oEnc = new RSACryptoServiceProvider(); //암호화


  oEnc.FromXmlString(sPubKey);

  //암호화할 문자열을 UFT8인코딩
  byte [] inbuf = (new UTF8Encoding()).GetBytes(sValue);
  //암호화
  byte [] encbuf = oEnc.Encrypt(inbuf, false);
  
  //암호화된 문자열 Base64인코딩
  return Convert.ToBase64String(encbuf);
}
//RSA 복호화
public static string RSADecrypt(string sValue,string sPrvKey)
{
  //개인키 생성
  byte [] inbuf = Convert.FromBase64String(sPrvKey);
  sPrvKey =  (new UTF8Encoding()).GetString(inbuf);

  //RSA객체생성
  System.Security.Cryptography.RSACryptoServiceProvider oDec = new RSACryptoServiceProvider(); //복호화
  //개인키로 활성화
  oDec.FromXmlString(sPrvKey);

  //sValue문자열을 바이트배열로 변환
  byte [] srcbuf = Convert.FromBase64String(sValue);

  //바이트배열 복호화
  byte [] decbuf = oDec.Decrypt(srcbuf, false);

  //복호화 바이트배열을 문자열로 변환
  string sDec = (new UTF8Encoding()).GetString(decbuf,0,decbuf.Length);
  return sDec;
}

#endregion

}
}


'C# > 기능 활용' 카테고리의 다른 글

C# 프로그램 사용기한 체크  (0) 2015.10.23
C# Get Mac Address  (0) 2015.10.12
C# Get IP Address (사설 IP, 공인 IP)  (0) 2015.10.11
C# 인코딩  (0) 2015.09.24
C# OS 버전 및 플랫폼 확인 방법  (0) 2015.08.06
블로그 이미지

Link2Me

,
728x90

C# 소스 예제에 대한 설명을 보고 싶다면

http://www.codeproject.com/ 사이트를 참조


OS 버전 및 플랫폼 확인 방법


static void Main(string[] args)

        {

            OperatingSystem os = System.Environment.OSVersion;

            Console.WriteLine("플랫폼 : " + os.Platform);

            Console.WriteLine("서비스팩 : " + os.ServicePack);

            Console.WriteLine("버전 : " + os.Version);

            Console.WriteLine("버전 문자열 : " + os.VersionString);

            Console.WriteLine("CLR버전 : " + System.Environment.Version);

            Console.ReadLine();

        }


'C# > 기능 활용' 카테고리의 다른 글

C# 프로그램 사용기한 체크  (0) 2015.10.23
C# Get Mac Address  (0) 2015.10.12
C# Get IP Address (사설 IP, 공인 IP)  (0) 2015.10.11
C# 인코딩  (0) 2015.09.24
문자열 암호화 - RSA, MD5, DES  (0) 2015.08.07
블로그 이미지

Link2Me

,
728x90

C#을 처음 배울 때부터 내 목표는 분명했다.

바로 C# dataGridView 와 MySQL 연동이었다.

C#을 이용하여 MySQL 에 연결하는 방법인데 인터넷 검색해도 제대로 설명된 사이트 찾기가 정말 어렵다.

책도 보고, 구글링도 하고, 유투브 동영상도 보고 하면서 이해한 것을 정리해둔다.


1. MySQL Connectors 다운로드 및 설치

한번만 설치하면 된다.

먼저, http://dev.mysql.com/downloads/ 에 접속한다.





다운로드를 누르면 로그인 하라고 나온다.

로그인을 하고 나면 다운로드가 가능해진다.


mysql-connector-net-6.9.9.msi


이제 다운로드 받은 MySQL Connector 를 설치한다.






이제 설치된 파일이 어디에 있는지 확인을 해본다.

MySQL.Data.dll 파일을 찾아보니 .NET 버전별로 3개가 검색되는거 같다.



PC에 설치된 MySQL.Data.dll 파일이 어디에 위치하는지 확인을 해봤다.


2. MySQL.Data 참조 추가

이 과정은 소스 파일마다 추가를 해야 한다.



MySQL.Data 가 3개인데 어떤 버전인지는 확인이 어렵다. 내가 잘 못찾은 것인가?



MySQL.Data 가 추가된 것을 확인할 수 있다.



3. 다음에 해당코드.cs (ex, Forrm1.cs) 에

using MySql.Data.MySqlClient;
using MySql.Data.Types;  // 필요시 추가
를 추가해준다.


여기까지가 MySQL DB와 연결하기 위한 과정이다.

MySQL DB 에 접속하고, SELECT, UPDATE, INSERT, DELETE 를 하려면 방법을 알아야 한다.


만약 내 PC 에 MySQL DB 를 연동하려면, PC용 MySQL 을 받아서 설치해야 한다.

PC 용 APM(Apache + PHP + MySQL) 이나 MySQL Workbench 같은 툴을 설치하면 MySQL 이 설치된다.

가장 간편하게 설치하는 것은 AutoSet9 을 설치하면 된다. http://link2me.tistory.com/797 참조


'C# > C# SQL' 카테고리의 다른 글

C# MySQL 간단 코드 및 접속 기본지식 배우기  (0) 2015.12.04
C# MySQL 쿼리문과 연동 처리  (0) 2015.09.12
C# 콤보박스(comboBox) 와 SQL 연동  (0) 2015.09.10
C# 과 MySQL 연동  (0) 2015.08.29
C# ExecuteScalar 와 총 Record 수  (0) 2015.08.27
블로그 이미지

Link2Me

,
728x90

프로그램의 특정 영역에 마우스 오른쪽을 누르면 메뉴가 나오고 추가, 수정, 삭제, 닫기 등의 ContextMenu 를 만드는 방법이다. Youtube 외국 동영상 보고 따라서 하면서 개념을 익히는 중이다.





버튼을 하나 만들고 버튼 위에서 동작하는 ContextMenu 를 만들고자 한다면

contextMenuStrip 버튼을 Drag & Drop 하면 하단에 contextMenuStrip2 라고 추가된다.



Forgroud 를 더블 클릭하면 소스코드 편집상태로 들어간다.

ColorDialog 대화상자를 연결하는 코드를 적어준다.

       private void foregroundToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            ColorDialog dlg = new ColorDialog();
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                button1.ForeColor = dlg.Color;
            }
        }

        private void backgroundToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            ColorDialog dlg = new ColorDialog();
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                button1.BackColor = dlg.Color;
            }
        }


이제 button1 위에서 ContextMenu2 가 동작하게 하려면 아래 그림처럼 연결해준다.


이제 F5 키를 눌러서 실행하면

버튼 위에서 마우스 우클릭을 하면 디자인한 화면이 나온다.




배경색까지 적용해본 상태다.



'C# > Visual Studio' 카테고리의 다른 글

C# statusStrip 메뉴  (2) 2015.09.10
What's New in C# 6.0  (0) 2015.09.05
C# Name 명칭 변경  (0) 2015.09.02
C# 윈도우폼(로그인폼) 실행 팁 배우기  (0) 2015.08.17
C# 윈도우 실행폼 메뉴 만들기  (0) 2015.07.30
블로그 이미지

Link2Me

,
728x90


C# 기초적인 것을 배우면서 그림으로 캡쳐를 해두려고 한다. 전문 프로그래머가 아니므로 나중에 보면 도통 생각이 나지 않는다.

메뉴 만드는 유투브 동영상을 보고 간략하게 기록해둔다.



메뉴 이름을 지정하기


Main Menu 이름이라고 명칭 변경

(Name) 을 mmMainMenu 로 변경하면 아래처럼 변경된다.


상단메뉴와 서브 메뉴가 있는데

상단메뉴는 mnuFile, mnuEdit, mnuFont, mnuView, mnuHelp 과 같이 이름을 정한다.

파일(&F), 편집(&E), 서식(&O), 보기(&V), 도움말(&H)

서브메뉴는 menu item 의 약자인 miNew, miOpen, miSave, miSaveAs, miExit 와 같이 이름을 정한다.


- 를 입력하고 엔터키를 치면 구분선이 된다. 또는 마우스 우클릭하여 구분선을 선택해도 된다.



단축키 지정하기



서브 메뉴 비활성화하기



솔루션 탐색기에서 Form1.Designer.cs 파일에서 코드보기를 하면

메뉴 정의를 한 내용이 보인다. 아직 수정하지 않은 정의도 보인다.




텍스트박스를 하나 끌어다놓고

(.Name) = txtMain ,Multiline = True, ScrollBars = Vertical, Dock = Fill


'C# > Visual Studio' 카테고리의 다른 글

C# statusStrip 메뉴  (2) 2015.09.10
What's New in C# 6.0  (0) 2015.09.05
C# Name 명칭 변경  (0) 2015.09.02
C# 윈도우폼(로그인폼) 실행 팁 배우기  (0) 2015.08.17
C# 윈도우폼 ContextMenu 만들기  (0) 2015.08.02
블로그 이미지

Link2Me

,
728x90

Visual Studio 웹사이트에 가서 보니 2015 버전이 있어서 받아서 설치를 했다.

Visual Studio Community 2015 - 무료

라고 사이트에 명시되어 있다. 한참동안 설치를 한다.

그리고 사이트에서 회원가입하고 아이디를 등록했다.


설치하고 처음으로 실행했더니 시작페이지가 나오고

새프로젝트를 선택하고 Visual C#을 선택하고 콘솔 응용프로그램을 선택했다.


3번 부근에 여러가지가 나오는데 이 부분이 프로그램을 편하게 하기 위해 미리 만들어진 틀이라고 보면 된다.


프로젝트 이름은 프로그램을 기본 제공하는 이름으로 그대로 두고 확인을 눌렀더니 아래 그림이 나온다.

4번 ConsolApplicaton1 이라는 이름과 동일하게 namsespace 이름이 생성된다.

동영상 강좌를 좀 살펴봤더니 4번 이름을 지정한 것이 namespce 에 생성되는 거 같다.








제품등록을 누르면 로그인이 안된 상태이면 30일만 사용할 수 있다고 나온다.


로그인을 하고 나면 아래 화면처럼 사용이 허가되었다고 나온다.



블로그 이미지

Link2Me

,