frequently used code

GridControl, GridView

FocusedRowChanged

private void GridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
{
    if (sender is GridView view)
    {
        FocusedRowChanged(view);
    }
}

private void FocusedRowChanged(GridView view)
{
    if (view.Equals(gvwList))
    {
        if (view.RowCount > 0 && view.FocusedRowHandle >= 0)
        {
            if (string.IsNullOrEmpty(_findRowValue))
            {
                //// gvwList 에 행이 있을 때 처리할 코드
                //SetDataFromReferenceControl(grpMaster, grdList);
                //Func_P_SampleForm01_Q("detail");
            }
        }
        else
        {
            //// gvwList 에 행이 없을 때 처리할 코드
            //InitControls(grpMaster);
            //InitControls(grdDetail);
        }
    }
}

Grid Keeping 처리, GridRowsCopy 호출 전 조건 검사

private void AddKeepingDataRows(DataRow[] targetRows)
{
    if ((targetRows?.Length ?? 0) == 0)
        return;

    // 대상 DataRow에 같은 업체가 체크 되었는지 확인
    if (targetRows.Length > 1)
    {
        DataRow firstRow = targetRows.FirstOrDefault();
        string custcd = firstRow.GetValue("custcd")?.ToString() ?? string.Empty;
        string rcvcustcd = firstRow.GetValue("rcvcustcd")?.ToString() ?? string.Empty;

        if (targetRows.Any(x => !x.Equals(firstRow) && !(x.GetValue("custcd")?.ToString()?.Equals(custcd) ?? true)))
        {
            // 메시지 처리 (같은 업체끼리만 가능)
            return;
        }

        if (targetRows.Any(x => !x.Equals(firstRow) && !(x.GetValue("rcvcustcd")?.ToString()?.Equals(rcvcustcd) ?? true)))
        {
            // 메시지 처리 (같은 인수처끼리만 가능)
            return;
        }
    }

    // Keeping 검사
    if (gvwKeeping.RowCount > 0)
    {
        string custcd = gvwKeeping.GetValue(0, "custcd")?.ToString() ?? string.Empty;
        string rcvcustcd = gvwKeeping.GetValue(0, "rcvcustcd")?.ToString() ?? string.Empty;
        
        if (targetRows.Any(x => !(x.GetValue("custcd")?.ToString()?.Equals(custcd) ?? true)))
        {
            // 메시지 처리 (같은 업체끼리만 가능)
            return;
        }

        if (targetRows.Any(x => !(x.GetValue("rcvcustcd")?.ToString()?.Equals(rcvcustcd) ?? true)))
        {
            // 메시지 처리 (같은 인수처끼리만 가능)
            return;
        }
        
        // 중복 검사
        DataTable keepingDatas = grdKeeping.DataSource as DataTable;

        foreach (DataRow targetRow in targetRows)
        {
            string ordkey = targetRow.GetValue("ordkey")?.ToString() ?? string.Empty;
            
            if (keepingDatas.AsEnumerable().Any(x => x.GetValue("ordkey")?.ToString().Equals(ordkey) ?? false))
            {
                // 메시지 처리 (수주번호[] 는 이미 추가된 자료입니다)
                return;
            }
        }
    }

    // DataRow 복사 반복문
    foreach (DataRow targetRow in targetRows)
    {
        // 신규 행 추가
        DataRow newRow = GridAddNewRow(grdKeeping, gvwKeeping.RowCount);
        
        // 대상 DataRow의 컬럼을 반복
        foreach (DataColumn targetColumn in targetRow.Table.Columns)
        {
            // SetValue 확장 메서드는 존재하지 않는 ColumnName 일 경우 처리하지 않도록 예외 처리 되어 있음
            newRow.SetValue(targetColumn.ColumnName, targetRow.GetValue(targetColumn.ColumnName));
        }
        
        // 별도 DataColumn에 대한 처리
        newRow.SetValue("resultqty", targetRow.GetValue("janqty"));
    }
}

TreeList

FocusedNodeChanged

private void TreeList_FocusedNodeChanged(object sender, FocusedNodeChangedEventArgs e)
{
    if (sender is TreeList tree)
    {
        FocusedNodeChanged(tree);
    }
}

private void FocusedNodeChanged(TreeList tree)
{
    if (tree?.Equals(treeList) ?? false)
    {
        var focusedNode = tree.FocusedNode;
        if (focusedNode != null && !tree.IsAutoFilterNode(focusedNode))
        {
            if (string.IsNullOrEmpty(_findRowValue))
            {
                //// focusedNode가 있을 때 처리할 코드
                //SetDataFromReferenceControl(grpMaster, grdList);
                //Func_P_SampleForm01_Q("detail");
            }
        }
        else
        {
            //// focusedNode가 없을 때 처리할 코드
            //InitControls(grpMaster);
            //InitControls(grdDetail);
        }
    }
}

Find Row Pattern

GridControl

// 전역 필드 정의
private string _findRowValue = null;

// 조회 버튼
public override void ClickRetrieveButton()
{
    int beforeRowHandle = gvwList.FocusedRowHandle;
    int findIndex = 0;

    if (Func_P_SampleForm01_Q("list"))
    {
        if (!string.IsNullOrEmpty(_findRowValue))
        {
            findIndex = gvwList.LocateByValue("find_key", _findRowValue);
            
            if (findIndex == 0)
                beforeRowHandle = 0;
                
            _findRowValue = null; // findIndex를 찾고 초기화
            
            gvwList.FocusedRowHandle = findIndex;
        }
    }

    if (gvwList.FocusedRowHandle < 0
        || (beforeRowHandle <= 0 && gvwList.FocusedRowHandle == 0)
        || findIndex < 0)
    {
        FocusedRowChanged(gvwList);
    }
}

TreeList

// 전역 필드 정의
private string _findRowValue = null;

// 조회 버튼
public override void ClickRetrieveButton()
{
    int beforeNodeIndex = treeList.FocusedNode?.Id ?? -1;
    TreeListNode findNode = null;
    
    if (Func_P_SampleForm01_Q("list"))
    {
        if (!string.IsNullOrEmpty(_findRowValue))
        {
            findNode = treeList.FindNode(x => x["find_key"].Equals(_findRowValue));
            
            if (treeList.FocusedNode == findNode)
                beforeNodeIndex = 0;
                
            _findRowValue = null; // findNode를 찾고 초기화
            
            if (findNode != null)
            {
                findNode.ExpandToFirstNode(); // 첫번째 노드까지 확장
                treeList.FocusedNode = findNode; // Focus
            }
        }
        else
        {
            if (treeList.Nodes.Count > 0)
                treeList.Nodes.FirstNode.Expand();
        }
    }

    if (treeList.FocusedNode == null || treeList.IsAutoFilterNode(treeList.FocusedNode)
        || (beforeNodeIndex <= 0 && treeList.FocusedNode.Id == 0)
        || findNode == null)
    {
        FocusedNodeChanged(treeList);
    }
}

Resize

  • 사이즈를 동적으로 제어할 컨트롤의 부모 컨트롤에 이벤트 핸들러를 추가하고 다음과 같이 구현

  • 예시 코드 설명

    • grpList의 너비를 제어하고 싶으면 grpList의 부모 컨트롤인 폼(this)

    • grpAnswer의 높이를 제어하고 싶으면 grpList의 부모 컨트롤인 panDetail

public Form1()
{
    InitializeComponent();
    
    this.Resize += OnResize;
    panDetail.Resize += OnResize;
}

private void OnResize(object sender, EventArgs e)
{
    var control = sender as Control;
    int width = control.Width; // 이벤트 핸들러를 호출한 컨트롤의 너비
    int height = control.Height; // 이벤트 핸들러를 호출한 컨트롤의 높이

    if (sender.Equals(this))
    {
        grpList.Width = width / 3;
    }
    else if (sender.Equals(panDetail))
    {
        int tempHeight = height - panMaster.Height;

        grpAnswer.Height = tempHeight / 3;
    }
}

DragDrop

윈도우 탐색기에서 파일 또는 폴더 드랍

  • 생성자에 다음과 같이 처리

public SY_TEST01() 
{
    InitializeComponent();
    
    // Control.AllowDrop 속성을 true로 설정
    grdList.AllowDrop = true;

    // Control.DragOver 이벤트 핸들러 생성 및 추가
    grdList.DragOver += (s, e) => e.Effect = DragDropEffects.Copy;

    // Control.DragDrop 이벤트 핸들러 생성 및 추가
    grdList.DragDrop += OnDragDrop;
}
  • OnDragDrop 이벤트 핸들러

private void OnDragDrop(object sender, DragEventArgs e)
{
    if (sender.Equals(grdList))
    {
        string[] files = e.Data.GetData(DataFormats.FileDrop) as string[];

        foreach (string filename in files)
        {
            // ...
        }
    }
}

GridControl에서 선택된 행을 다른 GridControl로 드랍

  • 전역 필드 정의

private GridHitInfo _gridHitInfo = null;
  • 생성자에 다음과 같이 처리

public SY_TEST01() 
{
    InitializeComponent();
    
    // 드랍 대상 GridControl
    grdList.AllowDrop = true;
    grdList.DragOver += (s, e) => e.Effect = DragDropEffects.Copy;
    grdList.DragDrop += OnDragDrop;
    
    // 드래그 대상 GridView
    gvwRefData.MouseDown += OnMouseDown;
    gvwRefData.MouseMove += OnMouseMove;
}
  • OnMouseDown 이벤트 핸들러

private void OnMouseDown(object sender, MouseEventArgs e)
{
    if (sender is GridView view)
    {
        _gridHitInfo = null;

        GridHitInfo hitInfo = view.CalcHitInfo(new Point(e.X, e.Y));

        if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.None)
            _gridHitInfo = hitInfo;
    }
}
  • OnMouseMove 이벤트 핸들러

private void OnMouseMove(object sender, MouseEventArgs e)
{
    if (sender is GridView view)
    {
        if (e.Button == MouseButtons.Left && _gridHitInfo != null)
        {
            Size dragSize = SystemInformation.DragSize;
            Rectangle dragRect = new Rectangle(new Point(
                _gridHitInfo.HitPoint.X - dragSize.Width / 2,
                _gridHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);

            if (!dragRect.Contains(new Point(e.X, e.Y)))
            {
                DataRow row = view.GetDataRow(view.FocusedRowHandle);
                if (row == null) return;

                view.GridControl.DoDragDrop(row, DragDropEffects.All);
                
                _gridHitInfo = null;
                DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
            }
        }
    }
}
  • OnDragDrop 이벤트 핸들러

private void OnDragDrop(object sender, DragEventArgs e)
{
    if (sender.Equals(grdList) && (_gridHitInfo?.View?.Equals(gvwRefData) ?? false))
    {
        DataRow dataRow = e.Data.GetData(typeof(DataRow)) as DataRow;
        
        //
        // ...
        //
    }
}

TreeList에서 선택한 노드를 GridControl로 드랍

  • 전역 필드 정의

private TreeListHitInfo _treeHitInfo = null;
  • 생성자에 다음과 같이 처리

public SY_TEST01()
{
    // 드랍 대상 GridControl
    grdList.AllowDrop = true;
    grdList.DragOver += (s, e) => e.Effect = DragDropEffects.Copy;
    grdList.DragDrop += OnDragDrop;
    
    // 드래그 대상 TreeList
    treeRefData.MouseDown += OnMouseDown;
    treeRefData.MouseMove += OnMouseMove;
}
  • OnMouseDown 이벤트 핸들러

private void OnMouseDown(object sender, MouseEventArgs e)
{
    if (sender is TreeList tree)
    {
        _treeHitInfo = null;
    
        TreeListHitInfo hitInfo = tree.CalcHitInfo(new Point(e.X, e.Y));
    
        if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.None)
            _treeHitInfo = hitInfo;
    }
}
  • OnMouseMove 이벤트 핸들러

private void OnMouseMove(object sender, MouseEventArgs e)
{
    if (sender is TreeList tree)
    {
        if (e.Button == MouseButtons.Left && _treeHitInfo != null)
        {
            Size dragSize = SystemInformation.DragSize;
            Rectangle dragRect = new Rectangle(new Point(
                _treeHitInfo.MousePoint.X - dragSize.Width / 2,
                _treeHitInfo.MousePoint.Y - dragSize.Height / 2), dragSize);

            if (!dragRect.Contains(new Point(e.X, e.Y)) && tree.FocusedNode != null)
            {
                tree.DoDragDrop(tree.FocusedNode, DragDropEffects.All);
                
                _treeHitInfo = null;
                DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
            }
        }
    }
}
  • OnDragDrop 이벤트 핸들러

private void OnDragDrop(object sender, DragEventArgs e)
{
    if (sender.Equals(grdList) && (_treeHitInfo?.Node.TreeList.Equals(treeRefData) ?? false))
    {
        TreeListNode node = e.Data.GetData(typeof(TreeListNode)) as TreeListNode;
        
        //
        // ...
        //
    }
}

GroupControl

Custom Button Click

// 이벤트 핸들러 추가
grpList.CustomButtonClick += GroupControl_CustomButtonClick;
private void GroupControl_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
{
    (sender as Control).Focus();
    string tagValue = e.Button?.Properties?.Tag?.ToString() ?? string.Empty;
    
    if (sender.Equals(grpList))
    {
        // 행추가
        if (tagValue.Equals("add"))
        {
            // ...
        }
        // 행 삭제
        else if (tagValue.Equals("remove"))
        {
            // ...
        }
    }
    else if (sender.Equals(grpDetail))
    {
        // ...
    }
}

GridView

DoubleClick

private void GridView_DoubleClick(object sender, EventArgs e)
{
    var view = sender as GridView;
    
    var dxMouseEventArgs = e as DevExpress.Utils.DXMouseEventArgs;
    GridHitInfo hitInfo = view.CalcHitInfo(dxMouseEventArgs.Location);
    
    if (hitInfo == null || hitInfo.InGroupRow || hitInfo.RowHandle < 0) 
        return;
        
    if (sender.Equals(gvwReceptionist))
    {
        // ...
    }
}

XtraReport

90도 회전된 출력물 (샘플 코드)

// 실제 출력할 원본 XtraReport 출력물 개체 생성
XtraReport1 originReport = new XtraReport1();

// 원본 XtraReport 개체를 Image로 변환하여 90도 회전
Image image = null;
using (MemoryStream ms = new MemoryStream())
{
    originReport.ExportToImage(ms);
    ms.Position = 0;
    image = Util.ConvertByteArrayToImage(ms.ToArray());
}
image.RotateFlip(RotateFlipType.Rotate90FlipNone);

// 위에서 만든 이미지를 사용하여 빈 XtraReport에 붙여넣음
XtraReport newReport = new XtraReport();
newReport.PaperKind = System.Drawing.Printing.PaperKind.Custom;
newReport.PageHeight = image.Size.Height;
newReport.PageWidth = image.Size.Width;
newReport.Landscape = image.Size.Width > image.Size.Height ? true : false;
newReport.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);

var detail = new DevExpress.XtraReports.UI.DetailBand();
detail.HeightF = image.Size.Width > image.Size.Height ? image.Size.Height : image.Size.Width;
newReport.Bands.Add(detail);

var pictureBox = new XRPictureBox();
pictureBox.SizeF = image.Size;
pictureBox.Image = image;
detail.Controls.Add(pictureBox);

newReport.ShowPreviewDialog();

Last updated

Was this helpful?