반응형
이슈 해결 과정을 요약해보려한다.
생각지도 못했던 문제들이 많았다.
현업에서 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;
}
반응형
'Language > C#' 카테고리의 다른 글
[C#] chart addXY zero point not showing (0) | 2022.07.07 |
---|---|
[C#] DataGridView Column Border (0) | 2022.07.06 |
[Error] System.Windows.Forms.DataGridViewCell.Value.get returned null (0) | 2022.07.05 |
[리스트로 바인딩 된 DataGridview] (0) | 2022.07.05 |
바인딩 된 datagridview에서 마우스 드래그로 컬럼 순서 변경 (0) | 2022.07.04 |