# BaseForm

## Fields

### Config

* 이전 버전의 "SessionInfo"

```csharp
protected readonly IConfig Config
```

## Property

### WordDatas

* 폼ID로 등록된 다국어 코드와 캡션 정보
* \[DevTool6 → 용어 정보] 메뉴에서 "용어 적용/저장"을 통해 저장된 데이터

```csharp
protected ReadOnlyDictionary<string, string> WordDatas { get; private set; }
```

### AttachmentHelper, FtpAttachmentHelper

* 첨부 파일 헬퍼 클래스의 개체

```csharp
protected internal AttachmentHelper AttachmentHelper { get; }

protected internal FtpAttachmentHelper FtpAttachmentHelper { get; }
```

### RetrieveHelper

* 데이터 조회 관련 헬퍼 클래스 개체
* 참고) [RetrieveHelper](/pluswin6/retrievehelper-paging-example.md)

```csharp
protected RetrieveHelper RetrieveHelper { get; }
```

## Method

### ClickRetrieveButton

* Browser의 '조회' 버튼 클릭시 호출되는 메서드로써, 재정의하여 사용

```csharp
public override void ClickRetrieveButton()
{
    // 조회 버튼 기능
}
```

###

### ClickNewButton

* Browser '신규' 버튼 클릭시 호출되는 메서드로써, 재정의하여 사용

```csharp
public override void ClickNewButton()
{
    // 신규 버튼 기능
}
```

### ClickCopyButton

* Browser의 '복사' 버튼 클릭시 호출되는 메서드로써, 재정의하여 사용

```csharp
public override void ClickCopyButton()
{
    // 복사 버튼 기능
}
```

### ClickSaveButton

* Browser의 '저장' 버튼 클릭시 호출되는 메서드로써, 재정의하여 사용

```csharp
public override void ClickSaveButton()
{
    // 저장 버튼 기능
}
```

### ClickDeleteButton

* Browser의 '삭제' 버튼 클릭시 호출되는 메서드로써, 재정의하여 사용

```csharp
public override void ClickDeleteButton()
{
    // 삭제 버튼 기능
}
```

### ClickPreviewButton

* Browser의 '미리보기' 버튼 클릭시 호출되는 메서드로써, 재정의하여 사용

```csharp
public override void ClickPreviewButton()
{
    // 미리보기 버튼 기능
}
```

### ClickPrintButton

* Browser의 '인쇄' 버튼 클릭시 호출되는 메서드로써, 재정의하여 사용

```csharp
public override void ClickPreviewButton()
{
    // 인쇄 버튼 기능
}
```

### InitBaseButtons

* 액션 버튼 디자인 수정 코드 작성

```csharp
protected override void InitBaseButtons()
{
    // ...
}
```

### GetServiceList

* 서비스 리스트 반환
* 로그인 한 사용자ID가 관리자, 개발자 권한일 때만 결과가 유효

```csharp
protected DataTable GetServiceList();
```

### UpdateProcessButtonState

* 액션 버튼들의 활성화 상태를 업데이트
* MenuPermissions 속성에 **처리 권한의 영향을 받음** **(허용되지 않은 권한에 대해서는 버튼이 활성화 되지 않음)**
* 처리 권한과 관계없이 상태를 변경하고자 할 경우에는 UpdateProcessButtonStateToHard 사용
* 참고)
  * ProcessButtonState
  * CurrentProcessButtonState
* Parameters
  * `ProcessButtonState processButtonState` : 적용할 버튼의 상태 ([\[Flags\] 특성의 열거형](https://docs.microsoft.com/ko-kr/dotnet/api/system.flagsattribute?view=netcore-3.1))
  * `bool value` : 버튼 활성화 상태 값

{% hint style="warning" %}
매개변수 `bool value`를 전달받는 메서드는 버튼의 상태를 하나씩 제어함

매개변수를 하나만 받는 메서드는 전달 받은 값으로 모든 버튼의 상태를 변경 (Example 2 참고)
{% endhint %}

{% tabs %}
{% tab title="C#" %}

```csharp
public void UpdateProcessButtonState(ProcessButtonState processButtonState);

public void UpdateProcessButtonState(ProcessButtonState processButtonState, bool value);
```

{% endtab %}

{% tab title="Example 1" %}

```csharp
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    
    // 탭페이지별 버튼 상태 초기화
    tpgProcessLayout.Tag = ProcessButtonState.Retrieve | ProcessButtonState.New | ProcessButtonState.Copy | ProcessButtonState.Delete;
    tpgMenuGroup.Tag = ProcessButtonState.Retrieve | ProcessButtonState.New | ProcessButtonState.Delete;
    
    // 탭페이지(tpgProcessLayout)의 버튼 상태 적용
    UpdateProcessButtonState((ProcessButtonState)tpgProcessLayout.Tag);
}


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);
}

```

{% endtab %}

{% tab title="Example 2" %}

```csharp
public void Example2()
{
    EnableButtonsAll(false);
    EnabledRetrieveButton = true;
    EnabledNewButton = true;
    // 조회(O) / 신규(O) / 복사(X) / 저장(X) / 삭제(X) / 미리보기(X) / 인쇄(X)

    UpdateProcessButtonState(ProcessButtonState.Preview);
    // 조회(X) / 신규(X) / 복사(X) / 저장(X) / 삭제(X) / 미리보기(O) / 인쇄(X)

    UpdateProcessButtonState(ProcessButtonState.Retrieve, true);
    // 조회(O) / 신규(X) / 복사(X) / 저장(X) / 삭제(X) / 미리보기(O) / 인쇄(X)

    UpdateProcessButtonState(ProcessButtonState.New, true);
    // 조회(O) / 신규(O) / 복사(X) / 저장(X) / 삭제(X) / 미리보기(O) / 인쇄(X)

    UpdateProcessButtonState(ProcessButtonState.Preview, false);
    // 조회(O) / 신규(O) / 복사(X) / 저장(X) / 삭제(X) / 미리보기(X) / 인쇄(X)
}
```

{% endtab %}
{% endtabs %}

### UpdateProcessButtonStateToHard

* 처리 권한을 무시하고 Browser 버튼들의 활성화 상태를 업데이트
* Parameters
  * `ProcessButtonState processButtonState` : 적용할 버튼의 상태 ([\[Flags\] 특성의 열거형](https://docs.microsoft.com/ko-kr/dotnet/api/system.flagsattribute?view=netcore-3.1))
  * `bool value` : 버튼 활성화 상태 값

```csharp
public void UpdateProcessButtonStateToHard(ProcessButtonState processButtonState);

public void UpdateProcessButtonStateToHard(ProcessButtonState processButtonState, bool value);
```

### CopyOfChangedData

* 이전 버전의 "BindingData"
* DataSource 속성에 할당된 DataTable에서 변경된 DataRow\.DataRowState들을 DataTable로 반환
* 반환되는 DataTable에는 "row\_status"라는 DataColumn이 추가되고, DataRow의 변경 상태에 대하여 다음과 같이 처리된 값이 할당됨

| DataRowState          | Value:string |
| --------------------- | ------------ |
| DataRowState.Added    | "N" (신규)     |
| DataRowState.Modified | "U" (수정)     |
| DataRowState.Deleted  | "D" (삭제)     |

* Parameters
  * `object target` : GridControl, TreeList, DataTable 타입의 객체
  * `bool showMessage` : 변경된 DataRow가 없을때 "저장할 내용이 존재하지 않습니다." 메시지를 띄울지 여부 (Default = true)
  * `out int alertIndex` : GridColumnEx 또는 TreeListColumnEx 의 AllowBlank 속성의 값이 false인 행에 값이 없을 경우 RowHandle 또는 NodeId 의 값을 할당
* Returns
  * `DataTable` : 변경된 DataRow들의 DataTable

```csharp
public DataTable CopyOfChangedData(object target, bool showMessage = false);

public DataTable CopyOfChangedData(object target, out int alertIndex, bool showMessage = false);
```

### GetBizConfigurationValue

* 이전 버전의 "GetCustomInfoValue"
* 'sys\_biz\_configuration' 프로시저 결과의 데이터 반환
* 메인 앱이 처음 실행될때 한번만 호출하기 때문에 변경된 정보가 반영되려면 응용 프로그램을 새로 시작해야함
* Parameters
  * `string @class` : 분류 (ex. "Session")
  * `string code` : 코드
* Returns
  * object : 값

```csharp
public ReadOnlyDictionary<string, string> GetBizConfigurationValue(string @class);

public string GetBizConfigurationValue(string @class, string code);
```

### GetLocalMachineName

* 이전 버전의 "GetClientPCName"
* 사용자 PC의 컴퓨터의 이름을 반환
* Returns
  * `string` : 컴퓨터 이름

```csharp
public string GetLocalMachineName();
```

### GetMacAddress

* 이전 버전의 "GetMacAddress"
* 사용자 PC의 MAC 주소를 반환
* Returns
  * `string` : MAC 주소

```csharp
public string GetMacAddress();
```

### GetLocalIpAddress

* 이전 버전의 "GetIPAddress"
* 사용자 PC의 내부 IP 주소를 반환
* Returns
  * `string` : IP 주소

```csharp
public string GetLocalIpAddress()
```

### GetPublicIpAddress

* 사용자 PC의 외부 IP 주소를 반환
* 외부 IP 정보를 반환하는 웹 사이트를 참조하는 방식
* 사이트 목록
  * <http://ipfind.co.kr>
  * <http://wtfismyip.com/text>
  * <http://ipinfo.io/ip>
  * <http://checkip.dyndns.org>
* Returns
  * `string` : 외부 IP 주소

```csharp
public string GetPublicIpAddress();
```

### ExecuteSql

* 쿼리 내용을 직접 입력하여 실행하고 그 결과를 반환
* Parameters
  * `string DBAlias` : 쿼리를 실행할 데이터베이스의 별칭
  * `string query` : 실행할 쿼리
  * `bool showMessageBoxWhenException` : 쿼리 실행시 발생한 에러 또는 사용자 정의 메시지 코드를 반환 받은 경우 자동으로 메시지를 띄울지 여부 (Default = false)
* Returns
  * `ResultSet` : 쿼리 실행 결과

```csharp
public ResultSet ExecuteSql(string DBAlias, string query, bool showMessageBoxWhenException = false);

public ResultSet ExecuteSql(string query, bool showMessageBoxWhenException = false);
```

### ExecuteProcedure

* ProcedureInfo 클래스를 상속 받은 저장 프로시저 클래스의 개체를 참조하여 처리 후 결과를을 반환
* Parameters
  * `string DBAlias` : 쿼리를 실행할 데이터베이스의 별칭
  * `ProcedureInfo procedureInfo` : 저장 프로시저 클래스 개체
  * `bool showMessageBoxWhenException` : 쿼리 실행시 발생한 에러 또는 사용자 정의 메시지 코드를 반환 받은 경우 자동으로 메시지를 띄울지 여부 (Default = false)
* Returns
  * &#x20;`ResultSet` : 쿼리 실행 결과

```csharp
public ResultSet ExecuteProcedure(string DBAlias, ProcedureInfo procedureInfo, bool showMessageBoxWhenException = true);

public ResultSet ExecuteProcedure(ProcedureInfo procedureInfo, bool showMessageBoxWhenException = true);
```

### ExecuteProcedures

* 하나 이상의 저장 프로시저를 묶어 한번의 트랜잭션에서 처리하며, 마지막에 처리된 결과만 반환
* 실행할 저장 프로시저의 정보는 `ProcedureInfo[]` 형식으로 전달받음
* Parameters
  * `string DBAlias` : 쿼리를 실행할 데이터베이스의 별칭
  * `ProcedureInfo[] procedureInfos` : 저장 프로시저 클래스 개체
  * `bool showMessageBoxWhenException` : 쿼리 실행시 발생한 에러 또는 사용자 정의 메시지 코드를 반환 받은 경우 자동으로 메시지를 띄울지 여부 (Default = false)
* Returns
  * &#x20;`ResultSet` : 쿼리 실행 결과

```csharp
public ResultSet ExecuteProcedures(string DBAlias, ProcedureInfo[] procedureInfos, bool showMessageBoxWhenException = true);

public ResultSet ExecuteProcedures(ProcedureInfo[] procedureInfos, bool showMessageBoxWhenException = true);
```

### ExecuteScalar

* 쿼리 내용을 직접 입력하여 실행하며 하나의 값의 반환
* Parameters
  * `string DBAlias` : 쿼리를 실행할 데이터베이스의 별칭
  * `string query` : 실행할 쿼리
* Returns
  * `object` : 쿼리 결과에서 첫번째 행의 첫번째 컬럼의 값

```csharp
public object ExecuteScalar(string DBAlias, string query);

public object ExecuteScalar(string query);
```

### ExecuteSqlDirectly

* 쿼리 내용을 직접 입력하여 실행하고 그 결과를 반환
* ExecuteSql 과 다른 점은 데이터베이스의 'sys\_execute\_query' 프로시저를 통해 쿼리를 처리하는 것이 아니기 때문에 실행 결과에 대한 기타 정보(ResultSet.ResultRows, ResultSet.ReturnString )를 받아오지 못함
* Parameters
  * `string DBAlias` : 쿼리를 실행할 데이터베이스의 별칭
  * `string query` : 실행할 쿼리
* Returns
  * `ResultSet` : 쿼리 실행 결과

```csharp
public ResultSet ExecuteSqlDirectly(string DBAlias, string query);

public ResultSet ExecuteSqlDirectly(string query);
```

### GetServerDateTime

* WAS(Web Application Server)의 일시(`DateTime`)를 반환
* Returns
  * `DateTime` : 현재 일시

```csharp
public DateTime GetServerDateTime();
```

### AddNewRowToGrid

* 이전 버전의 "GridAddNewRow"
* GridControl에 새로운 행 추가
* Parameters
  * `object grid` : GridControl 타입의 객체
  * `int index` : 행 추가 위치 (Default = FocusedRowHandle)
* Returns
  * `DataRow` : 새로 생성된 행

```csharp
public DataRow AddNewRowToGrid(object grid);

public DataRow AddNewRowToGrid(object grid, int index);
```

### DeleteRowInGrid

* 이전 버전의 "GridDeleteRow"
* GridControl의 행(Row) 제거
* Parameters
  * `object grid` : GridControl 또는 GridView 타입의 객체
  * `DataRow[] dataRows` : 위 GridControl에 바인딩된 DataTable의 DataRow
  * `bool showAlertMessage` : 대상 행을 지우기 전에 알림 메시지 팝업 여부 (Default = false)
* Returns
  * `bool` : 성공 여부

```csharp
public bool DeleteRowInGrid(object grid);

public bool DeleteRowInGrid(object grid, DataRow[] dataRows, bool showAlertMessage = false);
```

### DeleteAllRowsInGrid

* 이전 버전의 "GridDeleteAllRow"
* GridControl의 모든 행 제거
* Parameters
  * `object grid` : GridControl 또는 GridView 타입의 객체
  * `bool showAlertMessage` : 대상 행을 지우기 전에 알림 메시지 팝업 여부 (Default = false)
* Returns
  * `bool` : 성공 여부

```csharp
public bool DeleteAllRowsInGrid(object grid, bool showAlertMessage = false);
```

### InitControlsRecursive

* 이전 버전의 "InitControls"

```csharp
public void InitControlsRecursive(Control control);
```

### OpenFormByTab

```csharp
public BaseForm OpenFormByTab(string formId, object param, bool isNewTab = false);
```

### OpenFormByPopup

```csharp
public DialogResult OpenFormByPopup(string formId, object param, out BaseForm baseForm);
```

### SetReadOnlyRecursive

* 이전 버전의 "ReadOnlyControl"

```csharp
public void SetReadOnlyRecursive(Control control, bool value, bool buttonsDisabled = true);
```

### FillValuesFromDataSource

* 이전 버전의 "SetData"

```csharp
public bool FillValuesFromDataSource(object targetControl, DataRow dataRow);

public bool FillValuesFromDataSource(object targetControl, DataTable dataTable);
```

### FillValuesFromDictionary

* 이전 버전의 "SetData"

```csharp
public bool FillValuesFromDictionary(object targetControl, System.Collections.IDictionary dictionary);
```

### FillValuesFromReferenceControl

* 이전 버전의 "SetDataFromReferenceControl"

```csharp
public bool FillValuesFromReferenceControl(object targetControl, object referenceControl);
```

### GetDecimalPointFromCode

* 이전 버전의 "GetDecimalPointFromDecimalType"

```csharp
public int GetDecimalPointFromCode(string decimalCode);
```

### RefreshLookUpItems

* 이전 버전의 "SetLookUp"

```csharp
protected void RefreshLookUpItems(RepositoryItemLookUpEditEx repositoryLookUp, bool initColumnDesign = false);

protected void RefreshLookUpItems(LookUpEditEx lookUpEdit, bool initColumnDesign = false);

protected void RefreshLookUpItems(IColumnItem columnItem, bool initColumnDesign = false);
```

### ValidateControls

* 파라미터(`object control`)의 자식 컨트롤들 중 AllowBlank 속성 값이 false인 객체에 입력된 데이터가 없는 경우 "\[XXX] 은(는) 필수입력항목입니다." 메시지 출력를 출력하고 false를 반환
* Parameters
  * `object control` : PanelControl, GroupControl, XtraTabControl, XtraTabPage 타입의 객체
* Returns
  * `bool` : 검사 결과

```csharp
public bool ValidateControls(object control);
```

### ValidateDateTime

* 파라미터(`object dateTime`)가 날짜 타입인지 여부를 반환
* Parameters
  * `object dateTime` : 날짜 형식의 객체 (DateTime 또는 string 타입)
* Returns
  * `bool` : 검사 결과

```csharp
public bool ValidateDateTime(object dateTime);
```

### FindControl

* 폼의 모든 자식 컨트롤을 대상으로 파라미터(`string controlName`)와 이름이 같은 컨트롤을 반환
* Parameters
  * `string controlName` : 컨트롤 이름
* Returns
  * `object` : 찾은 컨트롤, 없으면 `null`

```csharp
protected object FindControl(string controlName);
```

### SetGlobalValue

* 이전 버전의 "SetBrowserVariable"
* 메인 앱에 변수를 할당하여 프로그램이 종료되기 전까지 유지
* Parameters
  * `string @class` : 변수 분류
  * `string code` : 변수 코드
  * `object value` : 변수 값
  * `bool isOverWrite` : 덮어쓰기 여부 (Default = true)

```csharp
protected void SetGlobalValue(string @class, string code, object value, bool isOverWrite = true);
```

### GetGlobalValue

* 이전 버전의 "GetBrowserVariable"
* 메인 앱에 할당된 변수를 반환
* Parameters
  * `string class` : 변수 분류
  * `string code` : 변수 코드
* Returns
  * object : 파라미터로 설정된 변수의 값

```csharp
protected object GetGlobalValue(string @class, string code);
```

### GetFormMessage

* 사용자 PC의 기본 문화권을 참조하여 해당 문화권 이름에 대한 폼에 설정된 메시지 내용을 반환
* Parameters
  * `string messageId` : 메시지 코드
  * `string alternativeMessage` : 코드가 존재하지 않을 경우 반환할 메시지 내용&#x20;
  * `bool showMessageId` : 반환할 메시지 내용에 코드를 포함할 것인지 여부 (Default = false)
* Returns
  * `string` : 메시지 내용

```csharp
protected string GetFormMessage(string messageId, string alternativeMessage, bool showMessageId = false);
```

### GetFormWordInfo

* 파라미터(`string formId`)로 등록된 다국어 코드와 캡션 정보
* Parameters&#x20;
  * `string formId` : 다국어 목록을 가져올 폼ID
  * `string cultureName` : 문화권 이름
* Returns
  * `DataTable` : 폼ID로 등록된 다국어 코드와 캡션 정보

```csharp
protected DataTable GetFormWordInfo(string formId, string cultureName);

protected DataTable GetFormWordInfo(string formId);
```

### ShowErrorMessageBox

* 에러 아이콘, OK 버튼만 가지는 디자인의 메시지 박스(팝업) 열기
* Parameters
  * `string message` : 메시지
  * `Exception ex` : 발생된 예외 객체

```csharp
protected void ShowErrorMessageBox(string message);

protected void ShowErrorMessageBox(Exception ex);
```

### ShowMessageBox

* 메시지 박스(팝업) 열기
* Parameters
  * `string msg` : 메시지
  * `string title` : 제목
  * `MessageFormButtons buttons` : 팝업에서 사용할 버튼 (Default = MessageFormButtons.OK)
  * `MessageFormIcon icon` : 팝업창의 아이콘 이미지 (Default = MessageFormIcon.Information)
* Returns
  * `DialogResult` : 팝업창의 반환 값

```csharp
protected DialogResult ShowMessageBox(string msg, string title = "", MessageFormButtons buttons = MessageFormButtons.OK, MessageFormIcon icon = MessageFormIcon.Information);
```

### GetWord

* '[WordDatas](#worddatas) 속성' 에서 파라미터(`string wordId`)에 대한 다국어 캡션을 반환
* Parameters
  * `string wordId` : 다국어 ID
  * `string` alternativeCaption : 다국어 ID가 존재하지 않으면 반환할 캡션 값
* Returns
  * `string` : 다국어 캡션&#x20;

```csharp
protected string GetWord(string wordId, string alternativeCaption);
```

### InitChildControlsRecursive

* 대상 컨트롤 `control` 로부터 모든 자식 컨트롤에 대한 초기화 처리 (재귀형)
* BaseForm.OnLoad 메서드에서 호출
* Parameters
  * `Control control` : Form, PanelControl, GroupControl 등의 객

```csharp
protected void InitChildControlsRecursive(Control control);
```

### GetDefault

* Visual Studio 확장 도구 "DevTool6"의 \[기본값 설정] 메뉴에서 설정한 사용자 지정 기본값 정보를 반환
* Parameters
  * `string processType` : 프로세스 타입
  * `string keyName` : 찾을 키 이름 (문자열)
  * `object nullValue` : 조건에 해당하는 등록된 값이 없을 경우 반환할 값 (Default = null)
  * `object control` : GridControl 또는 TreeList 타입의 객체
  * `string fieldName` : GridControl 또는 TreeList 타입의 객체에 설정된 Column의 FieldName
* Returns
  * `object` : 파라미터 조건에 해당하는 기본값 정보가 있으면 해당 값을 반환하고, 없으면 `object nullValue` 로 지정한 값을 반환

```csharp
public object GetDefault(string processType, string keyName, object nullValue = null);

public object GetDefault(string processType, object control, string fieldName, object nullValue = null);
```

### UploadDataFromDataTable

* 아직 구현되지 않음

```csharp
public bool UploadDataFromDataTable(DataTable data, string tableName, params string[] columnNames);

public bool UploadDataFromDataTable(DataTable data, string tableName, string[] columnNames, out string resultMessage);

public bool UploadDataFromDataTable(DataTable data, string tableName);
```

### GetTempDirectory

* 현재 실행 중인 응용 프로그램과 같은 위치의 폴더에 "temp" 폴더를 생성하고 경로를 반환
* 폴더가 이미 존재할 경우엔 생성하지 않음
* Returns
  * string : 임시 폴더 경로

```csharp
public string GetTempDirectory();
```

### ClearTempDirectory

* 임시 폴더 내 모든 파일을 삭제

```csharp
public void ClearTempDirectory();
```

### CreateSubForm

```csharp
public T CreateSubForm<T>(params object[] args);

public object CreateSubForm(Type type, params object[] args);
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://youngtae.gitbook.io/pluswin6/baseform.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
