Post List

2018/01/16

C#__6.0 응용 델리게이트(Delegate)_이벤트(Event)

이번에는 서로 다른 폼간에 함수를 제어하기 위해서 델리게이트와 이벤트를 사용하였습니다.

크리쳐정보가 담긴 테이블이 있는 메인폼에서 크리쳐 정보를 수정하기 위해 생성한 다이얼로그 창에서
세이브 버튼을 클릭했을  메인폼에 있는 크리쳐 인포 테이블을 갱신하여 보여주기 위한 함수를 컨트롤 하기 위함입니다.

테이블 정보를 보여주는 폼을 메인폼이라 칭하고특정 크리쳐 정보를 수정하기 위해 생성한 다이얼로그 창을 서브폼이라 하겠습니다.

아래 메인폼 클래스에서 서브폼을 생성한  서브폼이 멤버로 가지고 있는 이벤트에 메인폼에 있는

UpdateMonsterInfo(int id)라는 메소드를 델리게이트로 넘겨줍니다.


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
    //크리쳐정보들을 볼 수 있는 메인 폼.
    public partial class CreatureEditForm: Form
    {
        // 특정 크리쳐 인포를 수정하기 위한 다이얼로그 창.
        CreatureInfoEditDialog MInfoEditDlg;
        public CreatureEditForm()
        {
            MInfoEditDlg = new CreatureInfoEditDialog();
            // 크리쳐인포에딧창에서 완료 이벤트 발생시
            // 현재 폼에서 반응할 수 있는 이벤트를 추가.
            MInfoEditDlg.UpdateInfo += new CreatureInfoEditDialog.SuccessModify(UpdateMonsterInfo);
        }
        // 이벤트 함수. 크리쳐 인포 수정이 완료되면 메인폼에 있는 크리쳐 정보를 갱신하고, 
        // 데이터 변경이 일어난 데이터임을 표시함.
        private void UpdateMonsterInfo(int id)
        {
            ListViewItem        item = CreatureInfoListView.Items[id];
            CREATURETABLE_INFO  info = null;
            // 기존 데이터 수정인지 신규 데이터 수정인지 체크.
            if(id >= CreatureTable.GetSize)
            {
                foreach( CREATURETABLE_INFO rInfo in modifyCreatureTable.GetData)
                {
                    if(rInfo.MType == id)
                    {
                        info = rInfo;
                        break;
                    }
                }
            }
            else
            {
                info = CreatureTable.GetData[id]
            }
           
            int subItemId = 0;
            item.SubItems[subItemId++].Text = info.MType.ToString();
            item.SubItems[subItemId++].Text = info.SpriteTypes[0].ToString();         //stype
            item.SubItems[subItemId++].Text = info.Name.String;                    // name
            item.SubItems[subItemId++].Text = info.Level.ToString();                  // level
            
            ...
            item.BackColor = Color.LightPink;
        }
cs
서브폼에는 멤버로 이벤트와 델리게이트를 가지고 있으며여기에 선언된 델리게이트는 메인폼이 가진 메서드와 동일한 형태로 추가가 되어야 합니다.

서브폼에서 세이브버튼의 클릭 이벤트가 발생했을 메인폼의 메서드(UpdateMonsterInfo) 추가된 서브폼의UpdateInfo 이벤트를 호출합니다.
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
   // 크리쳐 정보를 수정하기 위한 다이얼로그 폼
    public partial class CreatureInfoEditDialog : Form
    {
        public delegate void SuccessModify(int id);
        public event SuccessModify UpdateInfo;
        private CREATURETABLE_INFO  originInfo;
        private int                 iMtype;
        private void modifySaveButton_Click(object sender, EventArgs e)
        {
            bool isModifyData = false;
            // 원본 데이터와 입력되어있는 데이터를 비교하여
            // 데이터체크 및 변경이 이루어짐.
            if( originInfo.SpriteTypes[0!= Int32.Parse(STypeField.Text) )
            {
                originInfo.SpriteTypes[0= Int32.Parse(STypeField.Text);
                isModifyData = true;
            }
            if (originInfo.Name.String != NameField.Text)
            {
                originInfo.Name.String = NameField.Text;
                isModifyData = true;
            }
            // 데이터 변경에 따른 이벤트 발생.
            if(isModifyData == true)
                UpdateInfo(iMtype);
            // 데이터 변경이 없음에 대한 알림.
        }
cs



Mtype88 크리쳐인포를 수정하겠다.
MType88 아이템을 더블클릭하면 CreatureInfoEditDialog창이 생성 된다.


여기서 이름을 'null'에서 '변경된이름으로 수정을 하고 Save 버튼을 클릭하여 CreatureEditForm으로 수정 완료에 대한 이벤트를 발생시킨다.

이벤트를 받은 CreatureEditForm에서 변경된 Mtype 받아 데이터 갱신과 변경된 데이터임을 표시한다.