프로그래밍 기술/Windows Form 응용 프로그램

2. 공용 컨트롤 , 동적으로 버튼 생성 [Windows Forms 응용 프로그램]

언제나휴일 2016. 4. 5. 13:24
반응형

   2. 공용 컨트롤

 

 이번 장에서는 Windows Forms 응용 프로그램을 만들 때 기본적으로 사용하는 공용 컨트롤들을 사용하는 방법을 다루기로 할게요.


도구 상자의 공용 컨트롤

[그림 2.01] 도구 상자의 공용 컨트롤

 

 

 

2. 1 실습: 동적으로 버튼 생성

 

 버튼은 사용자의 명령을 받아 특정 기능을 수행할 때 사용하는 컨트롤입니다.

 

 실습을 통해 버튼 사용법을 알아 봅시다.


동적으로 버튼 생성 실행 화면

[그림 2.02] 실행화면

 

 실습할 프로그램은 동적으로 버튼을 추가하며 각 버튼을 클릭했을 때의 클릭 수를 화면에 표시하는 프로그램입니다.

 

 폼의 상단에는 동적으로 생성한 버튼 개수를 표시하는 부분과 동적 버튼을 추가하기 위한 버튼이 있습니다. 그리고 동적으로 생성한 버튼과 Label을 배치할 FlowLayoutPanel이 있습니다. 또한 FlowLayoutPanel에는 Text 속성이 버튼, 클릭 수인 Label을 배치합니다.

 

 추가 버튼을 클릭하면 동적으로 버튼과 Label을 생성하여 FlowLayoutPanel에 배치합니다. 그리고 버튼 개수를 표시합니다.

 

 새로 생성하는 버튼은 순차적으로 Text 속성을 1, 2, 3 순으로 증가합니다. 그리고 동적으로 생성한 버튼을 클릭하면 버튼 우측에 배치한 Label에 현재까지의 누적 클릭 수를 표시합니다.

 

 

 먼저 폼에 컨트롤을 배치하세요.


동적으로 버튼 생성 컨트롤 배치

[그림 2.03] 컨트롤 배치

 

No

Name

컨트롤 형식

설명

1

label1

Label

단순 정보 표시

2

lb_count

Label

동적으로 생성한 버튼 수

3

btn_add

Button

동적으로 버튼을 생성

4

label2

Label

단순 정보 표시 Text(         버튼),배치 위해 적절히 공백

5

label3

Label

단순 정보 표시 Text(         클릭 수)

6

flp

FlowLayoutPanel

동적으로 생성한 버튼과 Label을 배치할 패널

BorderStyle(FixedSingle), size(215, 162)

[2.1] Form1의 자식 컨트롤

 

 키보드의 엔터 키를 누르면 btn_add 의 클릭 이벤트 핸들러가 동작하게 하려면 Form1  AcceptButton 속성을 btn_add로 설정하세요. ESC 키를 눌렀을 때 원하는 버튼의 클릭 이벤트 핸들러가 동작하게 할 때는 CancelButton 속성을 지정합니다.

 

 

 Form1 에서는 동적으로 생성한 버튼의 개수를 기억하는 멤버 필드를 선언하세요.

public partial class Form1 : Form

{

    int seq;

    ...중략...

}

 

 그리고 btn_add의 클릭 이벤트 핸들러를 추가하세요.

private void btn_add_Click(object sender, EventArgs e)

{

 동적으로 생성한 버튼의 개수를 나타내는 변수 seq 값을 1 증가합니다.

    seq++;

 버튼을 생성하여 Text 속성을 seq.ToString() 으로 설정합니다.

    Button btn = new Button();

    btn.Text = seq.ToString();

 생성한 버튼의 클릭 이벤트 핸들러를 추가합니다. += , 탭을 누르면 자동 추가합니다.

    btn.Click += new EventHandler(btn_Click);

 생성한 버튼을 flp 패널의 Controls 컬렉션에 추가합니다. 컨테이너 역할을 하는 컨트롤에는 자식 컨트롤을 보관하는 Controls 컬렉션 속성을 제공합니다.

    flp.Controls.Add(btn);

 클릭 수를 표시할 Label 추가합니다.

    Label lb = new Label();

 클릭 수를 기억하기 위해 Tag 속성에 0 설정합니다.

    lb.Tag = 0;

 배치할 여백을 지정하길 원하면 Margein 속성에 Padding 개체를 설정하세요.

    lb.Margin = new Padding(24, 8, 0, 0);

 Text 속성은 Tag 속성의 ToString() 으로 설정합니다.

    lb.Text = lb.Tag.ToString();

 생성한 Label 개체를 flp 패널의 Controls 컬렉션에 추가합니다.

    flp.Controls.Add(lb);

 버튼을 클릭했을 매핑하는 Label Text 속성을 변경하려면 Label개체를 알야야 합니다. 이럴 컨트롤에 있는 Tag 속성을 이용할 있습니다. 참고로 Tag 속성에는 어떠한 형식 개체든 보관할 있습니다.

    btn.Tag = lb;

 생성한 버튼 개수를 표시할 lb_count 개체의 Text 속성을 설정합니다.

    lb_count.Text = seq.ToString();

}

 

 생성한 버튼의 클릭 이벤트 핸들러를 구현합시다.

void btn_Click(object sender, EventArgs e)

{

   이벤트 핸들러의 첫번째 인자 sender 이벤트를 발생한 개체를 전달합니다. 여기에서는 버튼 개체입니다.

 sender Button 형식으로 참조합니다.

    Button btn = sender as Button;

 버튼의 Tag 속성에 설정한 Label 참조합니다.

    Label lb = btn.Tag as Label;

 Label Tag 속성에 설정한 클릭 개수를 가져옵니다.

    int clickcount = (int)lb.Tag;

 클릭 개수를 1 증가한 후에 Label Text 속성과 Tag 속성을 설정합니다.

    clickcount++;

    lb.Text = clickcount.ToString();

    lb.Tag = clickcount;

}

 

 빌드 한 후 테스트 해 보세요.

 

 이 외에도 Button에는 DialogResult 값을 지정할 수 있습니다. 여러 개의 폼 사이에 상호작용에서 다른 대화상자가 닫히면서 전달할 값을 설정할 때 많이 사용합니다.

 

 

 

Form1.cs

using System;

using System.Windows.Forms;

 

namespace ExButton

{

    public partial class Form1 : Form

    {

        int seq;

        public Form1()

        {

            InitializeComponent();

        }

        private void btn_add_Click(object sender, EventArgs e)

        {

            seq++;

            Button btn = new Button();

            btn.Text = seq.ToString();

            btn.Click += new EventHandler(btn_Click);

            flp.Controls.Add(btn);

 

            Label lb = new Label();

            lb.Tag = 0;

            lb.Margin = new Padding(24, 8, 0, 0);

            lb.Text = lb.Tag.ToString();

            flp.Controls.Add(lb);

 

            btn.Tag = lb;

            lb_count.Text = seq.ToString();

        }

 

        void btn_Click(object sender, EventArgs e)

        {

            Button btn = sender as Button;

            Label lb = btn.Tag as Label;

 

            int clickcount = (int)lb.Tag;

            clickcount++;

            lb.Text = clickcount.ToString();

            lb.Tag = clickcount;

        }

    }

}

 

반응형