Course D-2

팝업 폼 개발 및 데이터 처리

목표

  • 신규 팝업 폼을 개발하여 메뉴를 등록하고, [D-1] 과정에서 개발했던 폼에 데이터를 참조하는 코드 패턴을 실습합니다.

  • 학습 인정 시간: 4 시간 30 분

개발 화면

1. 비즈니스 로직 생성

  • [개발 화면]의 GridColumn을 참고하여 화면처럼 데이터가 조회되도록 하는 조회용 프로시저(P_DEV004_POP_xxx_Q)를 새로 생성합니다. ( ※ [B-1] 과정에서 생성했던 테이블을 사용합니다. )

  • 세부 코드 정보 테이블(comCodeMaster_xxx)의 사용 여부(use_yn)가 "Y" 인 자료만 조회합니다.

  • 체크용 GridColumn의 FieldName은 "chk"로 설정합니다.

2. 팝업 폼 화면 개발

2.1) 폼 생성 및 컨트롤 생성

  • 폼 생성 시 아래 사진을 확인하여 "그리드마스터" 폼 템플릿을 이용해 생성 후 [개발 화면]을 참고하여 디자인을 수정합니다.

2.2) GridColumn 체크 기능

  • 생성된 GridColumn 중 자료의 선택 목적으로 사용하는 FieldName이 "chk"인 GridColumn에 ColumnEdit 속성을 RepositoryItemCheckEditEx로 지정하고 UseUseCheckColumnHeader=ture, UseCaption=false 로 설정합니다.

2.3) GridView 행(Row) 수정 상태 숨기기

  • GridView 행에 체크 박스를 통해 값이 변경됨에 따라 수정 상태로 변경되는데, "U" 표시가 뜨지 않도록 설정합니다.

3. 폼 메시지 [GPM→개발→폼 메시지]

  • 폼 리스트를 조회하여 GPM Tools에서 생성했던 폼ID를 찾아 선택합니다.

  • '기본 메시지' 탭에서 행 추가하여 메시지를 입력하고 저장합니다.

4. 팝업 폼 기능 구현

4.1) 초기화

  • 'ParentGroupCode' 속성을 새로 정의합니다.

  • 코드에서 팝업 폼의 디자인 관련 속성을 변경하고 버튼에 OnClick 이벤트 핸들러를 등록 후 OnShown 메서드를 재정의하여 부모 폼에서 할당한 속성(ParentParameter)의 값을 현재 개체에 보관합니다.

// 부모 폼에서 받은 그룹코드
public string ParentGroupCode { get; private set; }

// 생성자
public DEV004_POP_xxx()
{
    InitializeComponent();

    // 팝업폼 디자인 설정
    StartPosition = FormStartPosition.CenterParent;
    MaximumSize = MinimumSize = Size;
    MaximizeBox = MinimizeBox = false;
    
    ...
    
    // 버튼 클릭 이벤트 핸들러 등록
    btnRetrieve.Click += OnClick;
    btnOk.Click += OnClick;
    btnCancel.Click += OnClick;
    
    // 조회조건 컨트롤에 엔터키 입력 시 조회 메서드 호출 적용
    foreach (Control control in grpTop.Controls)
    {
        if (control is DevExpress.XtraEditors.BaseEdit)
        {
            Util.AddEnterKeyDownAction(control, ClickRetrieveButton);
        }
    }
}

...

protected override void OnShown(EventArgs e)
{
    base.OnShown(e);

    // 부모 폼에서 할당한 파라미터(ParentParameter)를 현재 개체의 속성에 할당
    ParentGroupCode = ParentParameter?.ToString() ?? string.Empty;
}

4.2) 확인 버튼

  • 확인 버튼 클릭 시 선택된 행 여부를 검사하며, 동일한 그룹코드가 선택되었는지 확인 후 결과를 현재 개체의 FormResult 속성에 DataTable 타입으로 할당합니다.

private void OnClick(object sender, EventArgs e)
{
    if (sender.Equals(btnRetrieve))
    {
        ClickRetrieveButton();
    }
    else if (sender.Equals(btnOk))
    {
        if (Confirm())
        {
            DialogResult = DialogResult.OK;
            this.Close();
        }
    }
    else if (sender.Equals(btnCancel))
    {
        this.Close();
    }
}
private bool Confirm()
{
    // 선택된 행
    DataRow[] checkedRows = (grdList.DataSource as DataTable)?.Select("chk = 'Y'");

    if ((checkedRows?.Length ?? 0) == 0)
    {
        ShowMessageBox(GetFormMessage("PROJECTBASE_012", "선택된 자료가 없습니다."));
        return false;
    }

    // 첫 번째 행의 그룹코드와 부모폼으로부터 전달받은 그룹코드를 비교
    DataRow firstRow = checkedRows.FirstOrDefault();
    string firstGroupCode = firstRow.GetValue("group_code")?.ToString() ?? string.Empty;

    // 부모 GroupCode가 빈 값이 아닐때만 검사
    if (!string.IsNullOrEmpty(ParentGroupCode))
    {
        if (!ParentGroupCode.Equals(firstGroupCode))
        {
            ShowMessageBox(GetFormMessage("DEV004_POP_xxx_001", "이미 등록된 그룹코드와 동일한 그룹코드인 자료만 선택 가능합니다."));
            return false;
        }
    }

    // 선택한 행들간 그룹코드 검사
    if (checkedRows.Any(x => !x.Equals(firstRow) && !firstGroupCode.Equals(x.GetValue("group_code")?.ToString())))
    {
        ShowMessageBox(GetFormMessage("DEV004_POP_xxx_002", "동일한 그룹코드끼리만 선택 가능합니다."));
        return false;
    }

    // 정상 체크시 체크된 행을 새로운 DataTable로 반환
    FormResult = checkedRows.CopyToDataTable();

    return true;
}

5. 팝업 폼 배포

  • 팝업 폼을 메뉴 폼에서 호출하기 위해서는 메뉴 등록 및 어셈블리 배포가 전제되기 때문에 [GPM→개발→메뉴 편집]에서 메뉴를 등록하고 [어셈블리 배포]에서 어셈블리를 배포합니다.

6. 팝업 폼 사용

6.1) 메뉴 폼(DEV004_xxx) 화면 수정

  • 네 번째 탭 페이지를 추가하여 GroupControlEx와 GridControlEx을 배치하여 GridColumn을 다음 사진과 같이 구성하고 용어 정보를 수정합니다.

  • 위에서 배치한 GroupControlEx(grpDataRef)에 Custom Header Button 2개를 추가하여 UseCaption 속성은 false, Tag 속성은 각각 "popup", "clear"로 설정한 다음 버튼 이미지를 선택합니다.

6.2) 메뉴 폼(DEV004_xxx) 기능 구현

  • GroupControlEx에 추가했던 버튼에 대해여 이벤트 핸들러(GroupControlEx_CustomButtonClick)를 등록하고 팝업 데이터 참조와 추가된 행을 모두 지우는 기능을 구현합니다.

  • ※ 비슷한 케이스의 GridControl에서 데이터 참조 및 조건 검사 패턴에 대한 [링크] 확인

public DEV004_xxx()
{
    InitializeComponent();
    ...

    grpDataRef.CustomButtonClick += GroupControlEx_CustomButtonClick;
    
    ...
}
private void GroupControlEx_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
{
    (sender as Control)?.Focus();
    string tagValue = e.Button.Properties.Tag?.ToString() ?? string.Empty;

    ...    

    // 공통코드정보 탭 페이지
    else if (sender.Equals(grpDataRef))
    {
        // 팝업 데이터 참조
        if (tagValue.Equals("popup"))
        {
            string groupCode = string.Empty;

            // GridView에 행이 존재할 경우 첫 번째 행의 group_code 값을 팝업 폼으로 전달
            if (gvwDataRef.RowCount > 0)
            {
                groupCode = gvwDataRef.GetRowCellValue(0, "group_code")?.ToString() ?? string.Empty;
            }

            DataTable popupResult = OpenFormByPopup("DEV004_POP_xxx", groupCode) as DataTable;

            // 팝업 폼의 결과 데이터 유효할 경우 GridView에 행 추가
            if ((popupResult?.Rows?.Count ?? 0) > 0)
            {
                foreach (DataRow refRow in popupResult.Rows)
                {
                    DataRow newRow = GridAddNewRow(gvwDataRef, gvwDataRef.RowCount);
                    newRow.SetValue("group_code", refRow.GetValue("group_code"));
                    newRow.SetValue("group_name", refRow.GetValue("group_name"));
                    newRow.SetValue("sub_code", refRow.GetValue("sub_code"));
                    newRow.SetValue("code_name", refRow.GetValue("code_name"));
                }
            }
        }
        // 초기화
        else if (tagValue.Equals("clear"))
        {
            InitControls(grdDataRef);
        }
    }
}

6.3) 결과 확인

이미 GSTBrowser가 실행 중일 때 팝업 폼 메뉴를 등록한 경우, GSTBrowser의 우측 상단 사용자ID를 클릭하여 '메뉴 새로고침' 기능을 실행해야 팝업 폼이 정상적으로 로드됩니다.

7. 체크 리스트

  • [공통코드정보] 탭 페이지에서 '자료 참조 버튼' 클릭 시 팝업 폼이 정상적으로 실행되는지 확인합니다.

  • [공통 코드 참조 팝업]에서 데이터가 조회 조건에 맞게 조회되는지 확인하며, 체크 필드에 체크 처리가 제대로 되는지 확인합니다.

  • [공통 코드 참조 팝업]에서 서로 다른 그룹코드를 체크하고 확인 버튼 클릭시 등록했던 폼 메시지가 제대로 출력되는지 확인합니다.

  • [공통코드정보] 탭 페이지의 GridControl에 행이 등록되어 있는 상태에서 [공통 코드 참조 팝업]을 띄워 이미 등록된 그룹코드와 다른 그룹코드 데이터를 선택하고 확인 버튼 클릭시 등록했던 폼 메시지가 제대로 출력되는지 확인합니다.

  • [공통코드정보] 탭 페이지에서 '초기화'버튼 클릭 시 GridControl에 등록된 행이 모두 지워지는지 확인합니다.

Last updated

Was this helpful?