Dev Express의 그리드에서 사용하는 이벤트및 이벤트 응용에 관한 코드. 컬럼이 에디터모드를 들어갈 때
private void gvMaster_ShowingEditor(object sender, CancelEventArgs e)//컬럼별로 튕기기 { var view = sender as GridView; string fieldName = view.FocusedColumn.FieldName; string[] disabledEditingColumns = { "a", "b","c", "d", "e" , "f" }; string[] enabledEditingColumsn = { "a", "b", "c", "d", "e", "f", "g" }; if (view.GetFocusedDataRow().RowState != DataRowState.Detached && view.GetFocusedDataRow().RowState != DataRowState.Added) if (disabledEditingColumns.Contains(fieldName)) e.Cancel = true; else if (enabledEditingColumsn.Contains(fieldName)) e.Cancel = false; else e.Cancel = true; }
row에 스타일
private void gvMaster_RowStyle(object sender, RowStyleEventArgs e)//열에 스타일 주기 { var row = gvMaster.GetDataRow(e.RowHandle); if (e.RowHandle >= 0 && row["A"].ToStringNull().Equals("N")) { e.Appearance.ForeColor = Color.Gray; e.Appearance.Font = new System.Drawing.Font(e.Appearance.Font, System.Drawing.FontStyle.Strikeout); } }
Cell 값이 변경
private void gv_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)//셀 값 변경 { var view = sender as GridView; if (view != null) { DataRow currentRow = view.GetFocusedDataRow(); if (currentRow.RowState == DataRowState.Detached || currentRow.RowState == DataRowState.Added) { if(e.Column.FieldName == "a") currentRow["a"] = ""est"; view.UpdateCurrentRow(); } } }
유효성체크
private bool ValidateCheck() { bool check = true; string requiredField = "a"; string filter = string.Empty; /* 변경된 내용처리 */ DataTable dtMasterCheck = _dsMaster.Tables[0].GetChanges(DataRowState.Added|DataRowState.Modified|DataRowState.Detached); if (dtMasterCheck != null && dtMasterCheck.Rows.Count > 0) { string[] requiredMsterColumns = { "a", "b", "c", "d"}; /* 변경된 테이블 루프 */ foreach (DataRow row in dtMasterCheck.Rows) { DataRow[] drMaster = _dsMaster.Tables[0].Select(string.Format("a = '' AND (b = '' OR c IS NULL))); foreach(DataRow checkRow in drMaster) { checkRow.ClearErrors(); foreach (string columnName in requiredMsterColumns) { if (checkRow[columnName].ToStringNull() == "") { checkRow.SetColumnError(columnName, requiredField); check = false; } } } } gvMaster.UpdateCurrentRow(); } return check; }
그리드의 cell에서 일어나는 이벤트로 특정 컬럼 또는 값으로 실행할지를 정할 수 있다.
gvGridview.RowCellClick += gvGridview_RowCellClick; private void gvGridview_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e) { if (e.Column.FieldName.Equals("column")) action............ }
그리드의 row에서 일어나는 이벤트로 특정 행에서만 실행 코드를 작성 할 수 있다.
gvGridview.RowClick += gvGridview_RowClick; private void gvGridview_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { // e.RowHandle 값을 활용하여 선택된 행이 몇번째 행인지 알 수 있다. }
그리드에서 Context Menu 사용할 때 사용하는 Event
private void GvMaster_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e) { if (e.HitInfo.InRow) { gvGridView.FocusedRowHandle = e.HitInfo.RowHandle; cmsMenu.Show(gvMaster.GridControl, e.Point);//Context Menu } }
double click 으로만 editor 가능하게 할 때 다음과 같이 하면 된다.
using DevExpress.XtraGrid.Views.Grid.ViewInfo; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Views.Base; private void gridView1_ShowingEditor(object sender, CancelEventArgs e) { if(!doubleClick) e.Cancel = true; else doubleClick = false; } private void gridControl1_MouseDoubleClick(object sender, MouseEventArgs e) { ColumnView view = grid.FocusedView as ColumnView; GridHitInfo hi = view.CalcHitInfo(e.Location) as GridHitInfo; if(hi.HitTest == GridHitTest.RowCell) doubleClick = true; }
devexpress grid에는 cell double click 이벤트가 따로 없기 때문에 약간의 편법을 사용해야된다.
다음과 같이 하면 어떤 행에서 더블클릭이 일어났는지 알수 있다.
private void GridView_DoubleClick(object sender, EventArgs e) { GridView view = (GridView)sender; Point pt = view.GridControl.PointToClient(Control.MousePosition); GridHitInfo info = view.CalcHitInfo(pt); if (info.InRow || info.InRowCell) { string colCaption = info.Column == null ? "N/A" : info.Column.FieldName; MessageBox.Show(string.Format("DoubleClick on row: , column: .", info.RowHandle, colCaption)); } }
그리드 수정 후 다른행으로 포커스 이동할 때 현재 행에 변경된 데이터 알림 및 행 초기화할 때 사용.
bvwList.BeforeLeaveRow += bvwList_BeforeLeaveRow; private void bvwList_BeforeLeaveRow(object sender, DevExpress.XtraGrid.Views.Base.RowAllowEventArgs e) { if (e.RowHandle < 0) return; DataRow row = bvwList.GetFocusedDataRow(); if (row.RowState == DataRowState.Added || row.RowState == DataRowState.Modified || row.RowState == DataRowState.Deleted) { DialogResult dr = MessageManager.ShowMessage(MessageType.Question, "변경된 데이터가 존재합니다. 이동하시겠습니까?"); if (dr == DialogResult.Yes) { row.RejectChanges(); } else { e.Allow = false; } } }
Cell Value Changing event
셀 벨류가 변경이 될 때 일어남.
이 때 주의 사항. GetFocusedDataRow()를 사용 하면, 포커스가 이동되지 않은 상태에서는 변경된 값을 알 수가 없음.
그래서 이벤트에서 던져는 주는 값을 사용해야됨.
bvwDetail.CellValueChanging += BvwDetail_CellValueChanging; private void BvwDetail_CellValueChanging(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { if (e.Column.FieldName == "AAA_CD") { var dr = dtPCS.Select(string.Format("PRDMCN_CD=''", e.Value)); if (dr != null && dr.Length > 0) { bvwDetail.SetFocusedRowCellValue("AAAA", dr[0]["AAAA"].ToString()); bvwDetail.SetFocusedRowCellValue("BBBB", dr[0]["BBBB"].ToString()); bvwDetail.SetFocusedRowCellValue("CCCC", dr[0]["CCCC"].ToString()); bvwDetail.SetFocusedRowCellValue("DDDD", dr[0]["DDDD"].ToString()); } } }
Grid에 바인딩 된 Datatable Row 데이터를 가지고 옴.
e.RowHandle을 사용해도 되나, 컬럼으로 Sort를 변경을 했을 경우, e.RowHandle은 정렬된 row 행번을 가지고 와서,
실제 Datable의 행번을 가지고 있지 않음. 그럴 때 다음과 같이 사용하면 됨.
private void Tab2Grid_BeforeLeaveRow(object sender, DevExpress.XtraGrid.Views.Base.RowAllowEventArgs e) { if (e.RowHandle < 0) return; string fieldName = string.Empty; bool changed = false; if (dtBind2 != null) { ///////////////////////////////////////////////////////////////////// var bindRow = ((AdvBandedGridView)sender).GetDataRow(e.RowHandle); int rowIndex = bindRow.Table.Rows.IndexOf(bindRow); ///////////////////////////////////////////////////////////////////// DataRow dtOriginal = dtBind2.Rows[rowIndex]; for (int i = 0; i < ((AdvBandedGridView)sender).Columns.Count; i++) { fieldName = ((AdvBandedGridView)sender).Columns[i].FieldName; if (dtOriginal[fieldName].ToString() != bindRow[fieldName].ToString()) changed = true; } } BindingSource bindingSource = gridControlList_Sub_Dtl.DataSource as BindingSource; DataTable dtSource = bindingSource.DataSource as DataTable; if (dtSource != null) { DataTable dtResult = dtSource.GetChanges(); if (dtResult != null) changed = true; } }
Grid 키 이벤트
팝업에서 엔터키를 치면, 자동으로 데이터 상위 페이지로 보낼 때.
private void advBandedGridView1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 13) { DataRow activeRow = advBandedGridView1.GetFocusedDataRow(); if (activeRow != null) { this.SelectInfo();//사용할 데이터 처리 this.DialogResult = DialogResult.OK; this.Close(); } } }
그리드이 컨트롤이 active 되었을 때, 해당 컨트롤의 제어
LookUpEdit의 동적으로 내용을 바꿀 때 사용.
1.그리드 생성시, 전체 데이터를 바인드
2.해당 컬럼이 active되었을 때, filter해서 사용.
활성화된 editor를 사용하기 위해서는 ShownEditor 이벤트를 사용해야된다.
ShowingEditor에서는 사용할 수 없다.
private void advBandedGridView1_ShownEditor(object sender, EventArgs e) { DevExpress.XtraGrid.Views.Base.ColumnView view = (DevExpress.XtraGrid.Views.Base.ColumnView)sender; if (view.FocusedColumn.FieldName.Equals("STORE_CD"))//column search { //active editor DevExpress.XtraEditors.LookUpEdit editor = (DevExpress.XtraEditors.LookUpEdit)view.ActiveEditor; string mtrlCD = view.GetFocusedRowCellValue("MTRL_CD").ToString(); var dt = GETCMCD("STORE", mtrlCD).Tables[0];//data search //bind if (dt.Rows.Count < 1) { editor.Properties.DataSource = null; } else { editor.Properties.DataSource = dt; if (dt.Rows.Count == 1) editor.ItemIndex = 0; } } }
'Winform' 카테고리의 다른 글
DevExpress Grid 컬럼 에러 표시 (0) | 2015.09.01 |
---|---|
DevExpress 체크박스 Repository (0) | 2015.09.01 |
[DevExpress] 간트 차트 (0) | 2015.08.31 |
[DevExpress] Spread Sheet 엑셀저장 (0) | 2015.08.31 |
[DevExpress] Master Detail 그리드 설정 (0) | 2015.08.31 |
댓글