본문 바로가기

카테고리 없음

Devexpress GridView 컬럼 위치 저장 불러오기 GridControl

반응형
  • DevExpress gridview 변경된 컬럼 순서 레이아웃 저장/복구 

화면 사용시 컬럼 위치를 변경후 화면을 닫았다가 화면을 다시 로드하면 컬럼 위치 수정된 것을 반영한 로직이다

 

내가 자주사용하는 레지스트리를 사용하여 구현하였다.

사용자 요구사항을 추가하다보며 간다한 컬럼 위치를 옮겨달라는 요구가 많이 접수된다.

 

지금 프로젝트에는 컬럼 위치 저장하는 모듈이 없어서 추가하였다.

 

아래 코드 컬럼 위치 변경될때 사용자별 그리드명별로 레지스트리에 저장하여 사용자별 그리드의 위치를 기억하는 로직이다

 

public class ColumnOrderHelper
    {
        private static string UserID = Account.USER_ID;
        private static string RegPath = $"Software\\TEXT_MES\\ColumnOrder";

         private static string MenuID = string.Empty;
        private static string SaveKey { get; set; } = "ColumnOrder";

        // GridView에서 컬럼 순서를 저장할 데이터 구조
        private static List<string> columnOrder = new List<string>();

        // GridView에서 컬럼 순서가 변경될 때 호출되는 이벤트 핸들러
        private static void GridView_ColumnPositionChanged(object sender, EventArgs e)
        {
            try
            {
                // 변경된 순서를 저장
                columnOrder.Clear();
                GridView gridView = (sender as GridColumn).View.GridControl.DefaultView as GridView;
                foreach (GridColumn column in gridView.Columns.OrderBy(c => c.VisibleIndex))
                {
                    if (column.Visible == true)
                        columnOrder.Add(column.FieldName);
                }

                // 변경된 순서를 레지스트리에 저장
                SaveColumnOrderToRegistry(gridView.Name, columnOrder);
            }
            catch (Exception)
            {

            }
        }

        // 레지스트리에 컬럼 순서를 저장하는 메서드
        private static void SaveColumnOrderToRegistry(string keyName, List<string> stringList)
        {
            try
            {
                // 리스트를 쉼표로 구분된 문자열로 변환
                string concatenatedString = string.Join(",", stringList);

                // 레지스트리에 값 저장
                RegistryKey key = Registry.CurrentUser.CreateSubKey(RegPath);
                key.SetValue(UserID + "_" + MenuID + "_" + keyName, concatenatedString);
                key.Close();
            }
            catch (Exception ex)
            {
                // 오류 처리
                //MessageBox.Show("Error: " + ex.Message);
            }
        }

        // 레지스트리에서 컬럼 순서를 불러오는 메서드
        public static void LoadColumnOrderFromRegistry(GridView gridView)
        {
            try
            {
                var userControl = FindTopLevelUserControl<Form>(gridView.GridControl);
                if (userControl != null)
                {
                    MenuID = userControl.Name;
                }
                var userControl2 = FindTopLevelUserControl<UserControl>(gridView.GridControl);
                if (userControl2 != null)
                {
                    MenuID = userControl2.Name;
                }


                gridView.OptionsCustomization.AllowColumnMoving = true;
                // 레지스트리에서 값 읽기
                RegistryKey key = Registry.CurrentUser.OpenSubKey(RegPath);
                if (key != null)
                {
                    string concatenatedString = key.GetValue(UserID + "_" + MenuID + "_" + gridView.Name) as string;
                    key.Close();

                    // 쉼표로 구분된 문자열을 리스트로 변환
                    string[] strings = concatenatedString?.Split(',');
                    List<string> loadedColumnOrder = new List<string>(strings);

                    if (loadedColumnOrder.Count > 0 && string.IsNullOrWhiteSpace(concatenatedString) == false)
                    {
                        //전부 숨김처리후 
                        //foreach (GridColumn column in gridView.Columns/*.OrderBy(c => c.VisibleIndex)*/)
                        foreach (GridColumn column in gridView.Columns.OrderBy(c => c.VisibleIndex))
                        {
                            //if (column.ColumnEdit != null)
                            //{
                            //    column.Visible = true;
                            //}
                            //else
                            {
                                column.Visible = false;
                            }
                        }

                        // 컬럼 순서를 불러와서 GridView에 적용
                        int index = 1;
                        foreach (string fieldName in loadedColumnOrder)
                        {
                            GridColumn column = gridView.Columns[fieldName];
                            if (column != null /*&& column.Visible == true*/)
                            {
                                column.Visible = true;

                                if (index == 1)
                                {
                                    column.VisibleIndex = 0;
                                }
                                else
                                {
                                    column.VisibleIndex = loadedColumnOrder.IndexOf(fieldName) + 1;
                                }
                                //column.VisibleIndex = index;
                                index++;
                            }
                        }
                    }

                }
            }
            catch (Exception ex)
            {
                // 오류 처리
                //MessageBox.Show("Error: " + ex.Message);
            }
            finally
            {
                gridView.OptionsCustomization.AllowSort = true;
                gridView.ColumnPositionChanged += GridView_ColumnPositionChanged;
            }
        }

        public static T FindTopLevelUserControl<T>(System.Windows.Forms.Control control)
        {
            // 부모가 null이 될 때까지 반복
            while (control != null)
            {
                // UserControl인지 확인하고 UserControl이면 리턴
                if (control is T)
                {
                    return (T)(object)control;
                }

                // 부모 컨트롤로 이동
                control = control.Parent;
            }

            // 상위 UserControl을 찾지 못한 경우 null 리턴
            return default(T);
        }

    }

 

 

호출코드

 

 ColumnOrderHelper.LoadColumnOrderFromRegistry(GRV_T1);//레지스트리 기반 컬럼순서 정렬

 

이벤트를 생성자나 LoadColumnOrderFromRegistry에 넣는다면 코드는 더욱더 줄어든다.

Program.cs
0.01MB