C#

C# MiniProject : QRcode를 이용한 입/출고 관리 시스템

J_Bin 2020. 7. 7. 11:01

내가 맡은 파트 : InputForm과 logout기능

 

1. InputForm

 

using MetroFramework.Forms;
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using ZXing;
using AForge.Video.DirectShow;
using AForge.Video;
using System.Data.SqlClient;
using MetroFramework;
/// <summary>
/// 사용한 Nuget패키지 : Zxing(qrcode 인식) , aforge(웹캠실행)
/// </summary>
namespace QRMiniproject
{
    public partial class InPutForm : MetroForm
    {
        string mode = "";
        //FilterInfoCollection 객체생성
        FilterInfoCollection FilterInfoCollection;
        //VideoCaptureDeveice 객체생성
        VideoCaptureDevice captureDevice = null;

        public InPutForm()
        {
            InitializeComponent();
            //그리드 column을 데이터에 맞게 자동으로 설정해줌.
            GrdInput.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        }

        
        /// <summary>
        /// Combobox의 DropDownstyle을 list로 변경하고 노트북에 연결된 웹캠의 정보를 나타낸다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void InPutForm_Load(object sender, EventArgs e)
        {
            FilterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            foreach (FilterInfo filterinfo in FilterInfoCollection)
            {
                CboDevice.Items.Add(filterinfo.Name);
                CboDevice.SelectedIndex = 0;
                UpdateData();
            }
        }
        /// <summary>
        /// InputTbl의 I_Idx, Indate, ID(제품코드), count(수량), storage(창고)를 불러오고 ClientTbl과
        /// innerjoin시켜 C_Idx에 맞는 C.Name(거래처를 불러온다. 불러온 데이터를 grid에 나타낸다.
        /// </summary>
        private void UpdateData()
        {
            using (SqlConnection conn = new SqlConnection(Commons.ConnString))
            {
                conn.Open(); 
                string strQuery = @"SELECT I_Idx, Indate AS 입고날짜, ID AS 제품코드 , Count AS 수량, Storage AS 창고, C.Name As '거래처' FROM InputTbl As I
                                    INNER JOIN ClientTbl AS C ON I.ClientIdx = C.C_Idx ";           //grid에 데이터 불러오기

                SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn);
                DataSet ds = new DataSet();
                dataAdapter.Fill(ds, " InputTbl ");

                GrdInput.DataSource = ds;
                GrdInput.DataMember = " InputTbl ";
                GrdInput.Columns[0].Visible = false;
            }
        }
        /// <summary>
        /// 노트북에 내장된 웹캠을 실행시키는 Code
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnQRNew_Click(object sender, EventArgs e)
        {
            captureDevice = new VideoCaptureDevice(FilterInfoCollection[CboDevice.SelectedIndex].MonikerString);
            captureDevice.NewFrame += captureDevice_NewFrame;
            captureDevice.Start();
            Picturebox.SizeMode = PictureBoxSizeMode.StretchImage;
            timer1.Start();
        }
        //eventArgs.Frame : 웹캠에 떠있는 화면을 clone(복제)해서 Bitmap화 시킨다음 picturebox의 image에 대입한다.
        private void captureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Picturebox.Image = (Bitmap)eventArgs.Frame.Clone();
        }
        /// <summary>
        /// tiemer interval을 1000으로 설정(1초룰 나타냄) QRcode를 인식하는 code
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {       //picturebox에서 출력되는 image를 1초단위로 인식하고 Bitmap화(이미지를 메모리형태로 저장?) 한다? (점 방식)
            if (Picturebox.Image != null)
            {   //barcodeReader 객체생성
                BarcodeReader barcodeReader = new BarcodeReader();
                //픽쳐박스의 이미지를 비트맵화시키고 decode한 값을 barcoderReader에 넣은 것을 result?
                Result result = barcodeReader.Decode((Bitmap)Picturebox.Image);
                //split : '/'을 기준으로 끊어준다. qr코드의 데이터의 원본은 123/456/789 이렇기 때문에 '/'단위로 끊어준다.
                if (result != null)
                {   //space라는 객체를 만듬 > '/' 단위로 끊어서 tostring화 한 다음 배열에 집어넣는다?
                    string[] space = result.ToString().Split(new char[] { '/' }, StringSplitOptions.None);
                    //txtbox순서대로 qrcode의 데이터를 끊어준다.
                    TxtClientidx.Text = space[1];    // 거래처번호
                    TxtProductidx.Text = space[2];   // 품목코드     
                    TxtProductUnit.Text = space[4];  // 수량
                    //타이머 stop
                    timer1.Stop();
                    //capturedevice가 계속 진행되면 연결을 끊어준다.
                    if (captureDevice.IsRunning)
                        captureDevice.Stop();
                }
            }
        }
        //save버튼 클릭시 발생하는 이벤트 : saveprocess메서드 발동
        private void BtnSave_Click(object sender, EventArgs e)
        {
            Saveprocess();
        }

        /// <summary>
        /// 우선 신규버튼을 누르고 데이터를 저장해야한다는 문구가 뜬다. 
        /// DB를 연결하고 쿼리문을 열어 UPDATE할 데이터들을 정한다.
        /// </summary>
        private void Saveprocess()
        {
            if (string.IsNullOrEmpty(mode))
            {
                MetroMessageBox.Show(this, "신규버튼을 누르고 데이터를 저장하세요.", "경고",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }


            //try~catch문을 이용하여 DB에 저장되어있지않는 데이터를 입력시 에러가 발생하는것을 예외처리함
            try
            {
                using (SqlConnection conn = new SqlConnection(Commons.ConnString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    string strQuery = "";
                    //업데이트 할 데이터들
                    if (mode == "UPDATE")
                    {
                        strQuery = @"UPDATE @dbo.@InputTbl SET Indate = @Indate, ID = @ID 
                                , Count = @Count , Storage = Storage , ClientIdx = @ClientIdx ";
                        cmd.CommandText = strQuery;
                    }
                    //신규로 삽입할 데이터들
                    else if (mode == "INSERT")
                    {
                        strQuery = @"INSERT INTO dbo.InputTbl
                                (Indate, ID, Count, Storage, ClientIdx)
                                VALUES (@Indate, @ID, @Count, @Storage, @ClientIdx)";
                        cmd.CommandText = strQuery;
                    }

                    //거래처번호
                    SqlParameter parmClientIdx = new SqlParameter("@ClientIdx", SqlDbType.Int);
                    parmClientIdx.Value = TxtClientidx.Text;
                    cmd.Parameters.Add(parmClientIdx);
                    //품목코드
                    SqlParameter parmID = new SqlParameter("@ID", SqlDbType.NVarChar, 50);
                    parmID.Value = TxtProductidx.Text;
                    cmd.Parameters.Add(parmID);
                    //수량
                    SqlParameter parmCount = new SqlParameter("@Count", SqlDbType.Int);
                    parmCount.Value = TxtProductUnit.Text;
                    cmd.Parameters.Add(parmCount);
                    //창고(콤보박스)
                    SqlParameter parmContainer = new SqlParameter("@Storage", SqlDbType.NVarChar, 50);
                    parmContainer.Value = CboContainer.SelectedItem;
                    cmd.Parameters.Add(parmContainer);
                    //오늘날짜
                    SqlParameter parmIndate = new SqlParameter("@Indate", SqlDbType.Date);
                    parmIndate.Value = DateTime.Now.ToString("yyyy-MM-dd");
                    cmd.Parameters.Add(parmIndate);

                    cmd.ExecuteNonQuery();
                    UpdateData();
                }
            }
            //에러 발생시 뜨는 문구를 정한다. 저장되어있지않는 거래처번호를 삽입하면 에러가 뜨게된다.
            //그러면 거래처번호를 저장할 수 있는 form으로 넘어갈 수 있다.
            catch (Exception)
            {
                DialogResult result;
                result = MetroMessageBox.Show(this, "저장된 거래처번호가 존재하지않습니다. 거래처번호를 등록하시겠습니까?", "오류",
                MessageBoxButtons.OKCancel);

                if (result == DialogResult.OK)
                {
                    ClientForm clientForm = new ClientForm();
                    clientForm.Show();
                }
            }
        }
        //BtnExit 클릭 시 프로그램 종료
        private void BtnExit_Click(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }
        //BtnNew 클릭 시 쿼리문에 삽입되는 INSERT 모드가 되고 ClearTextprocess 메서드가 발동
        private void BtnNew_Click(object sender, EventArgs e)
        {
            mode = "INSERT";
            ClearTextprocess();
        }

        //출력된 값들을 없애주는 메서드
        private void ClearTextprocess()        
        {
            TxtClientidx.Text = TxtProductidx.Text = TxtProductUnit.Text = "";
            CboContainer.Text = "";
        }
        //button1 클릭 시 form이 종료된다
        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        //수량 text에서 엔터(keychar : 13)을 누르면 saveprocess 메서드가 발동된다.
        private void TxtProductUnit_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(e.KeyChar == 13)
            {
                Saveprocess();
            }
        }
        /// <summary>
        /// 웹캠 출력을 정지하는 기능
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CameraOff_Click(object sender, EventArgs e)
        {//captureDeive의 출력값이 null이 아니고(출력이 될 때) and captureDevice가 실행되고 있을 때
            if (captureDevice != null && captureDevice.IsRunning)
            {//captureDevoce를 stop시키고 출력값을 null로 만들어라
                captureDevice.Stop();
                captureDevice = null;
            }

            //픽쳐박스의 이미지가 null이 아닐 때(이미지가 있을 때 > 웹캠이 동작하고 있을 때 ) 픽쳐박스의 이미지를 null로 만들어라
            if (Picturebox.Image != null) //picturebox에 값이 있을 때 초기화
            {
                Picturebox.Image = null;
            }
        }
    }
}
//inputForm 전체코드 분석

2. Logout

private void BtnLogOut_Click(object sender, EventArgs e)
        {
            DialogResult result;
            result = MetroMessageBox.Show(this, "로그아웃 하시겠습니까?", "정보",
                MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

            if(result == DialogResult.OK)
            {
                DialogResult resultLogout;
                LoginForm loginForm = new LoginForm();
                resultLogout = loginForm.ShowDialog();
                LblUserID.Text = Commons.LoginUserid;
            }
        }
        //logout기능

 

 

 

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

2020.07.14 (화) - C# review & 게임만들기  (0) 2020.07.14
2020.07.13(월) - C# review  (0) 2020.07.13
2020.07.01(수) - C# Review  (0) 2020.07.01
2020.06.30(화) - C# Review  (0) 2020.06.30
2020.06.29(월) - C# review  (0) 2020.06.29