퇴근5분전

 

 

 이번 플젝에서 그리드에 다음과 같이 표시해야 할 일이 있었다.

 

시작점은 노란색 바탕인데 A타입은 제일 아래, B타입은 그 한칸 위에서 시작한다.

 

시계방향으로 숫자를 배치하면 된다.

 

  테스트 2는  시작위치에서 부터 한칸씩 위로 올라가면서 값을 채우고

 끝까지 올라가면서 옆으로 옮겨서 내려오면서 값을 채우며 끝난다.

 

  private void test2()
        {
            DataTable table = new DataTable();
            table.Columns.Add("Block00");
            table.Columns.Add("Block01");

            int totalCount = 4;
            for (int loop = 0; loop < totalCount; loop++)
            {
                table.Rows.Add();
            }

            string type = "b";

            int currentCol = 0;
            int currentRow = (type == "a" ? totalCount : totalCount - 1 ) - 1;
            int startValue = 1;
            int step = -2;

            do
            {
                table.Rows[currentRow][currentCol] = startValue++;
                currentRow += step;               
                if (currentRow < 0)
                {
                    step *= -1; // 방향전환
                    currentRow = Math.Abs( currentRow - 1 ) % 2;
                    currentCol++;
                }
             
            } while (currentRow < totalCount && currentCol < 2); // 시계방향일때 종료지점
            dataGridView1.DataSource = table;
        }

 

 

 // 테스트는 위에서 부터 아래로 내려오면서 간단한 계산을 통해

 값을 채워 내려온다.  대신 타입과 홀수/짝수에 따라 시작위치가 다르다.

 노란색 시작점에서 시작이 아니고 제일 위에서부터 내려오면서 값을 채운다.

 

        private void testc()
        {
            DataTable table = new DataTable();
            table.Columns.Add("Block00");
            table.Columns.Add("Block01");

            int totalCount = 13;
            for (int loop = 0; loop < totalCount; loop++)
            {
                table.Rows.Add();
            }

            int startcol = 0;
            int startValue = totalCount / 2 + totalCount % 2;
            string type = "b";

            int simbol = 0;

            if (type == "a")
            {
                if (totalCount % 2 == 0) // 짝
                {
                    startcol = 1;
                    simbol = 1;
                    startValue ++; // a일때 짝수는 +1
                }
                else
                {
                    startcol = 0;
                    simbol = -1;
                }
            }
            else if (type == "b")
            {
                if (totalCount % 2 == 1) // 홀
                {
                    startcol = 1;
                    simbol = 1;
               
                }
                else
                {
                    startcol = 0;
                    simbol = -1;
                 
                }
            }

            for (int loop = 0; loop < totalCount; loop++)
            {               
                startValue = (simbol * loop) + startValue;
                simbol *= -1;
                table.Rows[loop]["Block0" + startcol] = startValue;
                startcol = ( startcol + 1 ) % 2;            
            }
            dataGridView1.DataSource = table;
        }

 

       이 방법은 간단한 수의 규칙을 찾아내고 만든 것이다ㅏ.

   

A타입만 써놨지만. B타입 4위치가 우측 칸부터 시작하고 우측에 표시되는 덧셈 뺄셈값의 부호가 반대가 된다. ( -1, +2, -3, +4, -5, 6 )

 

위의 두 처리방법 모두 간단한것인긴 한데..... 그냥 적어두자.

 

 음... 이번플젝에 개발 프레임웍으로 개발해야 하는데 뭔가 많이 부족한듯한데...

이거저거 추가해 놓긴 했는데... 아직도...

 

 DB소스관련 툴도 거의 다 만들었다. ms-sql이었다면 그냥 있는걸로 해결했을텐데.. 오라클이라

부족한거 다 채워넣었다.

 

 하나의 프로그램 화면을 거의 10일간 만들었는데... 중간 중간 리포트 뷰어이나 이미지 뷰어를 만드는 소비한 시간도

 

있지만... 일단 일이 머리속에 그려지지 않는게 가장 큰것 같은데...

 

 10일 소비했던 프로그램 화면이 거의 끝나긴 했는데... ( 아직도 팝업 미완성... )

 

내일부턴 속도가 나오려나?... 쿼리 생성기도 이제 쓸만해졌는데...

 

7시 반에 출근해서 저녁 9시까지 하는데도 안되다니...

 

설 전까지는 계속 달려봐야겠네...

 

후~~~ 쉬는게 쉬는게 아닌듯...한.....

 

 

 음... 오늘 플젝하면서 그리드 Summary 구현하다가 하도 지저분해져서 좀 쉽게 안되나 하고

 

고민 고민 하다가 좋은걸 만들어냈다.

 

아래는 샘플로 구현했던 코드이다.

 

요새 상용 그리드는 밴드까지 있어서 컬럼 하나 찾아 설정하려면 코드가 많이 길어진다.

 

그래서 탄생한 로직이 아래처럼 만든 소스이다.

 

원래 하려던 소스는

    SettingColumns( 그리드, 밴드, ("컬럼키", ( col )=>{ 

           컬럼 설정....

    }),  

    ("컬럼키2", ( col )=>{ 

           컬럼2 설정....

    }));

 

이런식으로... 처리할수 없을까 였는데...

 

쉽게 될것 같은게 한시간은 머리빠개지게 고민하고 코딩하고 했던것 같다.

 

Action이나 Func 대리자를 이용하여 처리하면 될 것 같았는데... 직접은 안되고.

Tuple<string, Action<Column>> 으로 여러개 하려니 직접 생성도 해야되고... 번거롭더라

 

그래서...  두 메서드를 연결하는 메서드 형태를 고안해냈다.

 

 

위에 소스의 흐름은 간략하게 설명하면 다음과 같다.      

    1. GetCol 을 호출하면서 컬럼키를 넘겨주고

    2. GetCol에서 반환된 Action<DataGridView>의 대리자가 SettingsColumns에 setTransfers에 쌓인다. 

    3. 다음 SettingsColumns에서 foreach하면서 쌓인 대리자를 하나씩 호출하면서 그리드를 넘겨주면서 호출을 한다.

    4. 그러면 Action<DataGridView> 대리자 안에 구현된 setColumn의 대리자를 호출하면서 그리드에서 컬럼을 꺼내 외부로 전달하게 된다.

    5. 전달받은 column 객체는 GetCol( "AAA", Col =>   이부분으로 Col 객체로 넘어오게 된다.

   이렇게 순차적으로 넘어오면 컬럼을 각각 입맛에 맞춰 수정해주면 된다.

 

그래서 이걸 이대로 쓰나?? 아니다. 좀더 줄여본다.

 

 

동일한 동작을 하도록 대리자를 만들었다.

 

이렇게 하면 좋은점이라고 생각되는 것은 그리드의 컬럼을 설정할때 위와 같이 하면

 

컬럼1 설정...

 

컬럼2 설정...

 

컬럼3 설정...

...

 

이런식으로 세로로 쭉!! 나열했을때

컬럼에 다른 옵션등을 주면 소스가 중간이 두꺼워지고 빈줄로 구분하거나 region으로 구역을 나누게 되는데

 

위처럼 하면

그리드.SetColumns(

GetCol("컬럼키", col =>{

        // 설정

}),

GetCol("컬럼키2", col => {

        // 설정

}),

...

);

 

이런식으로 함수차제로 쪼갤 수 있다.

물론 다른 형태로 조각 조각 내서 관리할수 도 있다.

그래도 그리드설정시 기본 컬럼도 같이 한셋으로 묶는게 가능해졌다.

 

 요새 상용그리드 같은 경우 band개념이 있어서 소스가 지저분해져서... 어떻게하면 구역을 쪼개서 묶을수 있나... 라고 고민했는데...

여기에 딱이네.