Course D-2
팝업 폼 개발 및 데이터 처리
목표
신규 팝업 폼을 개발하여 메뉴를 등록하고, [D-1] 과정에서 개발했던 폼에 데이터를 참조하는 코드 패턴을 실습합니다.
학습 인정 시간: 4 시간 30 분
개발 화면

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) 결과 확인


7. 체크 리스트
[공통코드정보] 탭 페이지에서 '자료 참조 버튼' 클릭 시 팝업 폼이 정상적으로 실행되는지 확인합니다.
[공통 코드 참조 팝업]에서 데이터가 조회 조건에 맞게 조회되는지 확인하며, 체크 필드에 체크 처리가 제대로 되는지 확인합니다.
[공통 코드 참조 팝업]에서 서로 다른 그룹코드를 체크하고 확인 버튼 클릭시 등록했던 폼 메시지가 제대로 출력되는지 확인합니다.
[공통코드정보] 탭 페이지의 GridControl에 행이 등록되어 있는 상태에서 [공통 코드 참조 팝업]을 띄워 이미 등록된 그룹코드와 다른 그룹코드 데이터를 선택하고 확인 버튼 클릭시 등록했던 폼 메시지가 제대로 출력되는지 확인합니다.
[공통코드정보] 탭 페이지에서 '초기화'버튼 클릭 시 GridControl에 등록된 행이 모두 지워지는지 확인합니다.
Last updated
Was this helpful?