Language/C#

[C#] Issue 해결 과정 Summary

비비이잉 2022. 7. 6. 15:31
반응형

이슈 해결 과정을 요약해보려한다. 

생각지도 못했던 문제들이 많았다.

 

현업에서 GridView 에서의 오름차순 , 내림차순 정렬 기능을 요청했다. 

 

오름차순 내림차순 변경

=> 오름차순, 내림차순 정렬을 위해서는 DataGridView 에 iBinding 문제로 DataTable 이 바인딩 되어있어야함 

=> List 형태로 바인딩 되어있는 DataGridView를 DataTable 형태로 바꾸어 주는 함수 구현 

     헤더 클릭 시 Arrow가 생성됨. 문제가 해결된 줄로 알았다. 

 

오름차순, 내림차순 정렬 시 string값으로 받아오기 때문에 자릿수가 달라지는 컬럼의 경우, 맨 앞자리값으로만 정렬이 됨 

= >type 캐스팅을 모든 컬럼에 대해서 개별적으로 해줘야 함.

 

현업에서는 GridView에서 컬럼 헤더를 드래그 했을 때에 , 컬럼 순서가 지정한 값으로 변경 되는 것을 요청했다

Mouse Down, Mouse Up , Mouse Move , Mouse DragDrop, Mouse DragOver 이벤트 추가

=> 마우스 클릭 시 위치를 DataGridview상의 컬럼 위치로 계산하여 준 뒤, 컬럼 위치를 바꿀 수 있도록 함수 구현

= >기존의 컬럼 사이즈 변경 가능하도록 하는 이벤트와 중복 실행이 되어 , 방법 추가로 구현 중..

: 해결 포인트

커서가 컬럼 경계면에서 SizeWE로 바뀌기 때문에 MoveDown 이벤트에서 받아오는 커서의 모양에 따라 column size를 조정할 것인지,  컬럼 드래그 이벤트를 수행할 것인지를 나눌 수 있도록 문제 해결 

private void metroGridWaferReview_MouseMove(object sender, MouseEventArgs e)
    {
        if (isResizeColumnWidth == true) Cursor = Cursors.SizeWE;
        if ((e.Button & MouseButtons.Left) == MouseButtons.Left && isResizeColumnWidth == false)
        {
            if (dragBoxFromMouseDown != Rectangle.Empty &&
                !dragBoxFromMouseDown.Contains(e.X, e.Y))
            {
                DragDropEffects dropEffect = metroGridWaferReview.DoDragDrop(metroGridWaferReview.Columns[columnIndexFromMouseDown], DragDropEffects.Move);
            }
        }
    }

    private void metroGridWaferReview_MouseDown(object sender, MouseEventArgs e)
    {
        if (Cursor.Current == Cursors.SizeWE) isResizeColumnWidth = true;
        if (Cursor.Current != Cursors.SizeWE) 
        {
            columnIndexFromMouseDown = metroGridWaferReview.HitTest(e.X, e.Y).ColumnIndex;
            if (columnIndexFromMouseDown != -1)
            {
                Size dragSize = SystemInformation.DragSize;

                dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);
            }
            else
                dragBoxFromMouseDown = Rectangle.Empty;
            isResizeColumnWidth = false;
        }
    }



    private void metroGridWaferReview_DragDrop(object sender, DragEventArgs e)
    {
        Point clientPoint = metroGridWaferReview.PointToClient(new Point(e.X, e.Y));
        columnIndexOfItemUnderMouseToDrop = metroGridWaferReview.HitTest(clientPoint.X, clientPoint.Y).ColumnIndex;
        string down = metroGridWaferReview.Columns[columnIndexFromMouseDown].Name.ToString();
        string drop = metroGridWaferReview.Columns[columnIndexOfItemUnderMouseToDrop].Name.ToString();
        int down_displayindex = metroGridWaferReview.Columns[down].DisplayIndex;
        int drop_displayindex = metroGridWaferReview.Columns[drop].DisplayIndex;
        List<string> list_columnname = new List<string>();
        if (e.Effect == DragDropEffects.Move)
        {
            for (int i = 0; i < metroGridWaferReview.Columns.Count; i++)
            {
                if (down_displayindex < metroGridWaferReview.Columns[i].DisplayIndex && metroGridWaferReview.Columns[i].DisplayIndex <= drop_displayindex)
                {
                    list_columnname.Add(metroGridWaferReview.Columns[i].Name);
                }
            }
            for (int i = 0; i < list_columnname.Count; i++)
                metroGridWaferReview.Columns[list_columnname[i]].DisplayIndex -= 1;
            metroGridWaferReview.Columns[down].DisplayIndex = drop_displayindex;
        }
        Cursor = Cursors.Default;
    }

    private void metroGridWaferReview_DragOver(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }

 

 

 

 

 

 

 

 

반응형