기존 프로젝트를 복사하여 새로운 폼을 생성해보고 XtraTabControl을 사용한 코드 작성 패턴, TreeList와 ChartControl에 데이터 바인딩을 실습합니다.
학습 인정 시간: 4 시간
개발 화면
1. 폼 생성
1.1) 기존 프로젝트 파일 복사
이전 과정에서 개발했던 "공통 코드 관리(DEV002_xxx)"의 프로젝트 폴더로 이동하여 bin, obj 폴더를 제거합니다.
해당 프로젝트 폴더와 Visual Studio Solution(.sln) 파일이 포함 되어있는 폴더를 복사합니다.
복사된 폴더의 이름을 "DEV004_xxx"로 변경하고, 해당 폴더 내 솔루션 파일(.sln)과 ".git" 폴더를 제거한 다음 마찬가지로 프로젝트 폴더의 이름도 변경합니다.
프로젝트 폴더 내 Visual C# Project File(.csproj)의 이름을 "DEV004_xxx.csproj"로 변경하고 실행하여 [VisualStudio→파일→모두 저장(Ctrl+Shift+S)]으로 "프로젝트 폴더"와 동일한 위치에 솔루션 파일(.sln)을 저장합니다.
솔루션 탐색기에서 클래스 파일 이름을 "DEV004_xxx.cs"로 변경하면 해당 클래스의 모든 참조 이름을 변경하겠냐는 알림 창이 뜨고, 확인 버튼을 클릭합니다.
마지막으로 [프로젝트 속성] 창에서 어셈블리 이름을 변경합니다.
1.2) 저장 프로시저 복사
DEV002_xxx 프로젝트의 조회, 저장용 프로시저를 열어 CREATE 문으로 수정 후 각각 "P_DEV004_xxx_Q", "P_DEV004_xxx_S"를 새로 생성합니다.
1.3) 폼 정보 등록 [GPM→개발→폼 정보]
[GPM Tools]로 프로젝트 파일을 생성한게 아니기 때문에 폼 정보를 다음과 같이 수동으로 등록합니다.
저장 후 [VisualStudio→도구→GPM Tools]를 실행하여 등록했던 폼 정보가 정상적으로 불러와지는지 확인합니다.
public DEV004_xxx()
{
InitializeComponent();
...
tabMain.SelectedPageChanged += TabMain_SelectedPageChanged;
}
...
private void TabMain_SelectedPageChanged(object sender, DevExpress.XtraTab.TabPageChangedEventArgs e)
{
// 이전 페이지에 버튼 상태 정보를 저장
if (e?.PrevPage != null)
e.PrevPage.Tag = CurrentProcessButtonState;
// 전환된 페이지의 Tag에 ProcessButtonState가 존재하지 않으면 초기화
if (!Enum.TryParse(e.Page?.Tag?.ToString() ?? string.Empty, out ProcessButtonState buttonState))
{
UpdateProcessButtonState(ProcessButtonState.None);
return;
}
// 전환된 페이지가 가지고 있던 버튼 상태로 변경
UpdateProcessButtonState(buttonState);
}
각 버튼별 클릭 메서드(ClickRetrieveButton, ClickNewButton ...)에 현재 선택된 탭 페이지를 비교하는 코드를 작성합니다.
// 조회
public override void ClickRetrieveButton()
{
// 처리영역 탭
if (tabMain.SelectedTabPage.Equals(tpgEdit))
{
int beforeRowHandle = gvwList.FocusedRowHandle;
int findIndex = 0;
if (Func_P_DEV004_xxx_Q("list"))
{
if (!string.IsNullOrEmpty(_FindRowValue))
{
findIndex = gvwList.LocateByValue("group_code", _FindRowValue);
_FindRowValue = null; // findIndex를 찾고 초기화
gvwList.FocusedRowHandle = findIndex;
}
}
if (gvwList.FocusedRowHandle < 0
|| (beforeRowHandle <= 0 && gvwList.FocusedRowHandle == 0)
|| findIndex < 0)
{
FocusedRowChanged(gvwList);
}
}
// 조회영역 탭
else if (tabMain.SelectedTabPage.Equals(tpgTreeView))
{
}
}
// 신규
public override void ClickNewButton()
{
// 처리영역 탭
if (tabMain.SelectedTabPage.Equals(tpgEdit))
{
InitControls(grpMaster);
InitControls(grdDetail);
ReadOnlyControl(txtGroup_code1, false);
}
}
// 저장
public override void ClickSaveButton()
{
// 처리영역 탭
if (tabMain.SelectedTabPage.Equals(tpgEdit))
{
if (Func_P_DEV004_xxx_S(txtGroup_code1.ReadOnly ? "U" : "N"))
{
ClickRetrieveButton();
}
}
}
// 삭제
public override void ClickDeleteButton()
{
// 처리영역 탭
if (tabMain.SelectedTabPage.Equals(tpgEdit))
{
if (gvwList.FocusedRowHandle < 0)
{
ShowMessageBox(GetFormMessage("PROJECTBASE_012", "선택된 자료가 없습니다."));
return;
}
else if (ShowMessageBox(GetFormMessage("PROJECTBASE_014", "정말 삭제하시겠습니까? 삭제하시려면 Yes를 클릭하세요."), "", MessageFormButtons.YesNo, MessageFormIcon.Question)
!= DialogResult.Yes)
{
return;
}
if (Func_P_DEV004_xxx_S("D"))
{
ClickRetrieveButton();
}
}
}