[C# 윈폼] 윈폼 컨트롤 static 객체로 생성하여 객체 상태 유지하기


안녕하세요.

 

오늘은 윈폼에서 static 을 이용하여 객체를 생성하여 프로그램이 종료될 때까지, 동일한 객체의 상태를 유지하는 방법에 대해서 알려드리려고 합니다.

 

제가 생각한 시나리오는 다음과 같습니다.


 

시나리오


1.  X, Y 값을 입력 받아서 X*Y의 개수 만큼 동적으로 버튼 컨트롤 생성한다.

2.  1번에서 생성한 버튼을 클릭할 시에 메인 폼에 있는 FlowLayoutPanel에 클릭한 버튼 객체를 이동시킨다.

3.  여기서 핵심은 버튼을 이동할 때, 새로운 객체를 생성해서 그리는 것이 아니라 1번에서 이미 생성한 버튼 객체를 그대로 옮겨 주는 것.

 

위의 시나리오 대로 한번 예제 코드를 작성하도록 하겠습니다.

 

먼저 윈폼 프로젝트를 하나 생성해 주시고, 다음과 같이 Label, TextBox, Button 컨트롤들을 배치해 주시기 바랍니다.

 

프로젝트 생성 및 컨트롤 배치



 

예제 코드


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

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 DynamicButton

{

    public partial class Form1 : Form

    {

        public int WIDTH = 0;

        public int HEIGHT = 0;

 

        static List<Control> btnList = new List<Control>();

 

        public Form1()

        {

            InitializeComponent();

 

            this.uiBtn_DynamicButton.Click += uiBtn_DynamicButton_Click;

        }

 

        public void uiBtn_DynamicButton_Click(object sender, EventArgs e)

        {

            Form frm = new Form();           

 

            DynamicButton(frm);

 

            frm.ShowDialog();

        }

 

 

        /// <summary>

        /// 버튼 컨트롤 동적으로 생성하기

        /// </summary>

        public void DynamicButton(Form frm)

        {

            int x = Convert.ToInt32(textBox1.Text.ToString());

            int y = Convert.ToInt32(textBox2.Text.ToString());

            int totalBtnCnt = x * y;

 

            FlowLayoutPanel flp = new FlowLayoutPanel();

            Control[] BTN = new Control[totalBtnCnt];

 

            for (int idx = 0; idx < totalBtnCnt; idx++)

            {

                BTN[idx] = new Button();

                BTN[idx].Name = idx.ToString();

                BTN[idx].Parent = this;

                BTN[idx].Size = new Size(9030);

                int a = idx + 1;

                BTN[idx].Text = "Dynamic_" + a.ToString();

 

                WIDTH += 80;

                HEIGHT += 30;

 

                BTN[idx].Click += Dynamic_Button_Click;

 

                btnList.Add(BTN[idx]);

                flp.Controls.Add(BTN[idx]);

            }

 

            frm.Controls.Add(flp);

            flp.Dock = DockStyle.Fill;

        }

 

        public void Dynamic_Button_Click(object sender, EventArgs e)

        {

            Button btn = sender as Button;

 

            for(int idx = 0; idx < btnList.Count; idx++)

            {

                if(btn.Name == btnList[idx].Name)

                {

                    flowLayoutPanel1.Controls.Add(btnList[idx]);

                }

            }

        }

    }

}

 

Colored by Color Scripter

cs

 

실행 결과



첫 번째 사진에서 보시게 되면, X = 4, Y = 2, 로 입력을 하였고 X*Y = 8 로써 총 8개의 동적 버튼 컨트롤이 생성 되었습니다.

 

저는 여기서 static List<Control> btnList = new List<Control>(); 이라는 정적 리스트 객체를 선언 하였고 여기에 동적으로 생성된 버튼 컨트롤을 저장하고 있었습니다.

그리고 다음으로 두번째 이미지에서 보시게 되면, 생성된 버튼 컨트롤을 클릭할 시, 2번째 폼에서 첫번째 폼으로 버튼이 이동해서 생성된 것을 확인하실 수 있습니다.^^


 

static 으로 컨트롤을 저정하고 있으면, new 객체로 새로 생성하지 않고 처음 생성한 상태 그래도 유지한 상태로 객체를 여기 저기 다양하게 호출하면서 사용할 수 있습니다.^^

 

이로써, static을 이용하여 객체 상태를 유지하는 방법에 대해서 알아보았습니다!!

 

감사합니다.^^


728x90

이 글을 공유하기

댓글

Designed by JB FACTORY