etcdoc
문서의 이전 판입니다!
개발중 참고할 자료
- Data Adapter의 동작이해
1. Data Adapter의 BaseData 속성은 DataTable이다.
RowStatus가 Added상태이면 연결된 하위 DataAdapter에 Select를 전달하지 않아서
하위 Data Adapter의 BaseData Table에 Column structure만들어지지 않는다.
이를 해결하기 위해 상위 BaseDatadp AcceptData() 를 호출할 필요가 있다.
=> Master에 발주마스터와 하위에 상세정보가 있는 데이터를 만들때 이런 문제에 봉착한다.
최초 화면이 만들어지고 새로운 발주정보등을 입력할때 최상위 Master에 발주정보 행이 하나 필요하게 되는데
이럴때 Select Procedure에서 빈행을 리턴하기 바란다. 그러면 이런문제는 없어진다.
이 특성을 만든 이유는 많은양의 상위 BaseData 로드될때 하위 DataAdapter가 있으면 속도가 느려지는 문제가 있다.
2. 데이터 상태변경 메커니즘 마스터 DataAdapter가 있고 그 하위에 자식 DataAdapter 가 있는 구조에서 하위 DataAdapter의 데이터가 변경되면 그에 연결된 상위 DataAdapter의 행도 같이 변경상태로 전환된다. 그렇게 하여 Parent DataAdapter.Update()를 호출하여 전에 변경된 DataSet을 저장할 수 있다.
3. DataAdapter의 Data와 UX Control간의 데이터 흐름 DataAdapter의 각 행의 컬럼이 GridView에 바인딩 되있고 동시에 TextEdit에 연결되 있는경우 TextEdit.EditValue의 값을 사용자가 변경한 경우 즉시 GridwVew의 해당 컬럼의 값도 변경된다.
4. 직접 DataAdapter의 BaseData(DataTable) 값을 직접 변경한 경우 화면에 연결된 Control들에게는 즉시 반영되진
않으며 즉시 반영되게 하고 싶으면 DataAdapter.UBiUpdateRow()를 호출 해야 한다.
DataRow newRow = adt.AddNewRow(); // 행을 DataTable추가함
또는
DataRow newRow = 그리드뷰.UBiAddNewRow(); // 행을 DataTable추가함
newRow["USE_YN"] = 'Y'; // 추가된행의 컬럼에 데이터 넣기
newRow["INSP_YN"] = 'Y';
newRow["BOM_YN"] = 'N';
newRow["PROC_QUAL_YN"] = 'Y';
newRow["REG_DT"] = DateTime.Now;
newRow["INPUT_LOCK"] = 'N'; // 2024.07.18 사장님 요청사항으로 기본적으로 설계가 완성되기전에 수주를 받을수 없음
newRow["SAMPLE_YN"] = 'N';
adt.UBiUpdateRow(); // adt.AddNewRow()
또는
그리드뷰.DataAdapter.UBiUpdateRow(); // 그리드뷰.UBiAddNewRow();
5. GridView, BandedGridview, AdvBandedGridView, TreeView 등에 바인딩 되는 DataSource는 View 이다.
위 Control에서 바인딩된 데이터에 접근하기 위해서는 아래 예와 같이 처리해야 한다.
ex)
foreach(DataRowView rv in (DataView)gridMain.GridControl.DataSource)
{
rv["ABC"] = "";
}
6. GridView에서 강제로 조건에 맞는 데이터 행을 삭제할때
foreach 로 삭제하면 문제가 발생합니다.
이런경우 제일 뒷(아래)쪽에서부터 삭제해야 문제가 없습니다.
ex)
for (int cnt = gridMain.RowCount; cnt >= 0; cnt--)
if (gridMain.GetRowCellValue(cnt, "CHK_DEL").Nvl().Equals("Y")
gridMain.DeleteRow(cnt);
- Extention Function
. null값을 가질 가능성이 있는 값 변환으로 if문에서 번거로뭄 해소
.Nvl(), .Nvl(""), .Nvl("0")
. 주어진 DataTime월의 첫번째 일자 public static DateTime LastDayOfMonth(this DateTime value)
. 주어진 DateTime 월의 마지막 일자 public static DateTime LastDayOfMonth(this DateTime value) . Json으로 Serialize된 문자열을 Deserialize한다. public static T JsonTo<T>(this string value)
. 해당 유형이 숫자 형태일 경우 True, 아닐경우 False를 반환한다. public static bool IsNumeric(this Type type)
- Etc
. GridView Column중 LookupEdit Type의 선택이 바뀌면 처리하는 방법
// 화면이 로드되면
private void HalfWorkWD_Load(object sender, EventArgs e)
{
필요한 코딩을 여기에...
// 입력된 반제품 행이 변경될경우 처리
viewSubHalf.UBiEventLookupChanged += (o, a) =>
{
DataRow toRow = viewSubHalf.GetFocusedDataRow(); // 현재 그리드 행의 DataRow
DataRow fromRow = a.Row; // 변경된 Lookup의 선택된 DataRow
if(fromRow != null && toRow != null && a.FieldName == "그리드의 Field Name")
{
toRow["SQR"] = fromRow["SQR"]; // 필요한 작업
}
};
}
. GridView 행중 특정(사용자가 의도하는) 조건에 맞는 경우 색을 바꿔보자
Class 생성자 또는 Load Event에 배치한다.
planView.RowCellStyle += (a, b) =>
{
UBiGridView view = a as UBiGridView;
if (b.RowHandle >= 0)
{
if (view.GetRowCellValue(b.RowHandle, "FINAL_YN").Nvl("N").Equals("Y"))
{
// FINAL_YN의 값이 "Y" 인경우 필드의 색을 바꾼다.
b.Appearance.ForeColor = Color.Magenta;
}
}
};
. 시간이 걸리는 작업 {저장, 조회 등...} 중에 사용자에게 메세지 표시하기
public override void OnSearchClick(UBiMdiForm f)
{
// 상위 클래스의 메서드 호출...
base.OnSearchClick(f);
try
{
// 시간이 오래걸릴때 보여주는 팝업
UBiMessageBox.ShowWait("Loading...", "Loading...");
mainView.DataAdapter.Select(true); // 조회를 한다.
}
catch (Exception ex)
{
ex.UBiShowException(this); // 오류시에 서버에서 보내온 메세지 표시
}
finally
{
//팝업을 제거한다.
UBiMessageBox.CloseWait();
}
}
etcdoc.1765005978.txt.gz · 마지막으로 수정됨: 저자 127.0.0.1
