C#
Delegate(대리자)
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace cs26_delegate { #region<대리자선언> //대리자 사용 선언 delegate int CalcDelegate(int a, int b); #endregion<대리자선언> delegate int Compare(int a, int b); #region<일반 클래스> class Calc { public int Plus(int a, int b) { return a + b; } //static으로 선언 시 실행과 동시에 메모리에 올라감 public static int Minus(int a, int b) { return a - b; } } #endregion<일반 클래스> internal class Program { static void Main(string[] args) { #region<일반 클래스> Calc normalCalc = new Calc(); int x = 10, y = 15; int res = normalCalc.Plus(x, y); Console.WriteLine(res); res = Calc.Minus(x, y);//Minus 메서드는 static이기에 바로 사용 가능 Console.WriteLine(res); #endregion #region<대리자> Console.WriteLine("== 대리자 방식 =="); //대리자 사용 방식 x = 30; y = 20; Calc delCalc = new Calc(); CalcDelegate Callback; Callback = new CalcDelegate(delCalc.Plus); int res2 = Callback(x, y); Console.WriteLine(res2); Callback = new CalcDelegate(Calc.Minus); res2=Callback(x, y); Console.WriteLine(res2); #endregion } } }
Event
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cs28_event { // 1.대리자 생성 delegate void EventHandler(string message); class CustomNotifier { // 2.이벤트 준비(대리자) public event EventHandler SomethingChanged; public void DoSomething(int number) { int temp = number % 10; if(temp!=0 && temp%3==0) { // 3.이벤트 발생 상황에서 이벤트 수행 SomethingChanged(string.Format("{0} : odd", number)); } } } internal class Program { // 4.이벤트가 대신 호출할 메서드 static void CustomHandler(string message) { Console.WriteLine(message); } static void Main(string[] args) { CustomNotifier notifier = new CustomNotifier(); notifier.SomethingChanged += new EventHandler(CustomHandler); for(int i=0; i<=30; i++) { notifier.DoSomething(i); } } } }
람다 식
class sample { private int valueA; public int ValueA { //get {return valueA;} //set {valueA=value;} get => ValueA; set => ValueA = value; } }
--> 주석처리된 부분을 람다함수로 변경하면 다음과 같이 변경 할 수 있음
C#(DB 연동)
SQLServer를 통한 DB 연동(SSMS 참조)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace wf09_dbhandling { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void FrmMain_Load(object sender, EventArgs e) { // 1.연결 문자열 생성 string connectionString = "Data Source=localhost;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=12345"; // 2.DB 연결을 위해 Connection 객체 생성 SqlConnection conn = new SqlConnection(connectionString); // 3.DB연결 conn.Open(); // 4.DB처리를 위한 쿼리 작성 string selQuery = @"SELECT CustomerID ,CompanyName ,ContactName ,ContactTitle ,Address ,City ,Region ,PostalCode ,Country ,Phone ,Fax FROM Customers"; // SqlDataAdapter 생성 SqlDataAdapter adapter = new SqlDataAdapter(selQuery,conn); //SqlCommand selCmd = new SqlCommand(selQuery, conn); //selCmd.Connection = conn; // 5.리더 객체 생성, 값 넘겨줌 //SqlDataReader reader = selCmd.ExecuteReader(); // 6. 데이터셋으로 전달 DataSet ds = new DataSet(); adapter.Fill(ds); // 7. 데이터그리드뷰에 바인딩하기위한 BindingSource 생성 BindingSource source = new BindingSource(); // 8. 데이터그리드뷰의 데이터 소스에 데이터 셋 할당 source.DataSource = ds.Tables[0]; DgvNorthwind.DataSource = source; // 9. DB Close conn.Close(); } } }
MySQL과 연동
using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace wf10_MySQL { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void FrmMain_Load(object sender, EventArgs e) { //MySQL용 연결문자열 string connectionString = "Server=localhost;Port=3306;Database=bookrentalshop;Uid=root;Pwd=12345;"; MySqlConnection conn = new MySqlConnection(connectionString); conn.Open(); string selQuery = @"SELECT memberIdx , Names , Levels , Addr , Mobile , Email FROM membertbl"; MySqlDataAdapter adapter = new MySqlDataAdapter(selQuery, conn); DataSet ds = new DataSet(); adapter.Fill(ds); DgvMember.DataSource = ds.Tables[0]; conn.Close(); } } }
전화번호는 Random으로 넣어둬서 실제 번호 아님
MDI 테스트
1) FrmMain의 IsMdiContainer 속성 True 로 변경하면 자동으로 최대화/최소화 조절
2) 프로젝트 우클릭 - 추가 - 새 항목 - 양식으로 ChildFrm1,ChildFrm2 추가
3) 프로젝트 우클릭 - 추가 - 새 항목 - Windows Forms의 정보상자 FrmAbout 추가using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace wf11_mditest { public partial class FrmMain : Form { FrmChild1 child1 = null; FrmChild2 child2 = null; public FrmMain() { InitializeComponent(); } private void MniForm1_Click(object sender, EventArgs e) {//폼1 클릭 시 child1 = new FrmChild1(); child1.TopLevel = false; //toplevel을 false로 수정해야 최상위 클래스를 FrmMain으로 잡고 그밑에다 생성 this.Controls.Add(child1); child1.Show(); } private void MniForm2_Click(object sender, EventArgs e) {//폼2 클릭 시 child2=new FrmChild2(); child2.TopLevel = false; this.Controls.Add(child2); child2.Show(); } private void MniExit_Click(object sender, EventArgs e) {//끝내기 클릭 Application.Exit(); } private void MniAbout_Click(object sender, EventArgs e) {//이 프로그램 클릭 시 FrmAbout about = new FrmAbout(); about.ShowDialog(); } } }