23.04.12 Day52

오윤범·2023년 4월 12일
0
post-custom-banner

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

post-custom-banner

0개의 댓글