본문 바로가기
Winform

DevExpress 그리드 이벤트

by 캡틴노랑이 2015. 8. 31.
반응형

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

댓글