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?